第8课 函数重载分析(上)

Posted wanmeishenghuo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第8课 函数重载分析(上)相关的知识,希望对你有一定的参考价值。

重载(Overload):

技术分享图片

 

C++中的函数重载:

技术分享图片

 

函数重载示例:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int func(int x)
 5 {
 6     return x;
 7 }
 8 
 9 int func(int a, int b)
10 {
11     return a + b;
12 }
13 
14 int func(const char* s)
15 {
16     return strlen(s);
17 }
18 
19 
20 int main(int argc, char *argv[])
21 {
22     printf("%d
", func(3));
23     printf("%d
", func(4, 5));
24     printf("%d
", func("D.T.Software"));
25     
26     return 0;
27 }

运行结果如下:

技术分享图片

 

函数重载至少满足下面的一个条件:

技术分享图片

 

上面的两个函数满足参数顺序不同,所以是可以构成重载函数的。

当函数默认参数遇上函数重载会发生什么?如下:

技术分享图片

 

用g++编译上述程序,结果如下:

技术分享图片

 

如果在main函数中不调用这个func函数的话,则编译器不会报错,因为,这两个函数确实构成了重载关系。但是如果在main函数中调用了func,则编译器不知道具体该调用哪一个函数,所以会报错。

 

编译器调用重载函数的准则:

  将所有同名函数作为候选者

  尝试寻找可行的候选函数  

    1、精确匹配实参

    2、通过默认参数能够匹配实参

    3、通过默认类型转换匹配实参

  匹配失败

    1、最终寻找到的候选函数不唯一,则出现二义性,编译失败

    2、无法匹配所有候选者,函数未定义,编译失败

 函数重载的注意事项:

技术分享图片

 

重载本质:

 1 #include <stdio.h>
 2 
 3 int add(int a, int b)  // int(int, int)
 4 {
 5     return a + b;
 6 }
 7 
 8 int add(int a, int b, int c) // int(int, int, int)
 9 {
10     return a + b + c;
11 }
12 
13 int main()
14 {
15     printf("%p
", (int(*)(int, int))add);
16     printf("%p
", (int(*)(int, int, int))add);
17 
18     return 0;
19 }

在VS2010上的运行结果如下:

技术分享图片

 

可见,两个函数的入口地址不同,因此,它们是不同的函数。

我们查看一下生成的中间文件test.obj,在VS2010自带的命令行工具下,输入dumpbin  /symbols test.obj,输出结果如下:

技术分享图片

 

我们看到00c和015这两项分别就是两个func函数对应的项,两个函数编译过后的标识符如下:

技术分享图片

 

这两个标识符是不一样的,C++编译器就是通过这种方式区别重载函数的。

小结:

  函数重载是C++中引入的概念

  函数重载用于模拟自然语言中的词汇搭配

  函数重载使得C++具有更丰富的语义表达能力

  函数重载的本质为相互独立的不同函数

  C++中通过函数名和函数参数确定函数调用

 

以上是关于第8课 函数重载分析(上)的主要内容,如果未能解决你的问题,请参考以下文章

第29课 类中的函数重载

第18课构造函数(中)

第47课 递归函数分析

第0-0课 - 引言

第30课 操作符重载的概念

好课分享:开课吧数据分析全栈工程师第8期 老杜2020版Java零基础685集(视频采用JDK13录制)