码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-08-23 02:19:40      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:bsp   src   类型   style   main函数   pre   编译   自带   重载   

重载(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\n", func(3));
23     printf("%d\n", func(4, 5));
24     printf("%d\n", 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\n", (int(*)(int, int))add);
16     printf("%p\n", (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课 函数重载分析(上)

标签:bsp   src   类型   style   main函数   pre   编译   自带   重载   

原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9521058.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!