重载(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++中通过函数名和函数参数确定函数调用