-
重载(Overload)
-
同一个标识符在不同的上下文有不同的意义
-
如:“洗”和不同的词汇搭配后有不同的含义,洗衣服,洗脸,洗脑,洗马桶。。。。
-
“play”和不同的单词搭配后有不同的含义,play chess,play piano,play basketball
-
函数重载( Function Overload)
-
用同一个函数名定义不同的函数
-
当函数名和不同的参数搭配时函数的含义不同
-
函数重载至少满足下面一个条件
-
参数个数不同
-
参数类型不同
-
参数顺序不同
-
编译器调用重载函数的准则
-
将所有同名函数作为候选者
-
尝试寻找可行的候选函数
-
精确匹配实参
-
通过默认参数能够匹配实参
-
通过默认类型转换匹配实参
-
匹配失败:最终寻找的候选函数不唯一,则出现二义性,编译失败。无法匹配所有候选者,函数未定义,编译失败。
-
函数重载的注意事项
-
重载函数在本质上是相互独立的函数
-
重载函数的函数类型不同
-
函数返回值不能作为函数重载的依据
-
函数重载是由函数名和参数列表决定的 1 #include "stdio.h" 2 #include "string.h"
3 int func(int x) 4 { 5 return x; 6 } 7 int func(int a,int b) 8 { 9 return a + b; 10 } 11 int func(const char*s) 12 { 13 return strlen(s); 14 } 15 int main() 16 { 17 printf("%d ",func(3)); 18 printf("%d ", func(3,4)); 19 printf("%d ", func("Hello World!")); //函数重载本质上不是同一个函数 printf("%p ",(int(*)(int))func); printf("%p ",(int(*)(int,int))func); 20 return 0; 21 }
运行结果:
pi@raspberrypi:~ $ ./a.out
3
7
11
0x10508
0x1052c
-
函数重载遇上函数指针
-
将重载函数名赋值给函数指针时:根据重载规则挑选与函数指针参数列表一致的候选者,严格匹配候选者的函数类型(包括返回值类型)与函数指针的函数类型
-
函数重载必然发生在同一个作用域中,编译器需要用参数类型或函数类型进行函数选择,无法直接通过函数名得到重载函数的入口地址 1 #include "stdio.h"
2 #include "string.h" 3 int func(int x) 4 { 5 return x; 6 } 7 int func(int a,int b) 8 { 9 return a + b; 10 } 11 int func(const char*s) 12 { 13 return strlen(s); 14 } 15 int main() 16 { 17 int p_value; 18 typedef int(*PFUNC)(int a); 19 PFUNC p = func; 20 p_value=p(8); 21 printf("p_value=%d ",p_value); 22 printf("%d ",func(3)); 23 printf("%d ", func(3,4)); 24 printf("%d ", func("Hello World")); 25 //重载函数本质上不是同一个函数 26 printf("%p ",(int(*)(int))func); 27 printf("%p ",(int(*)(int,int))func); 28 return 0; 29 }
运行结果:
pi@raspberrypi:~ $ ./a.out
p_value=8
3
7
11
0x10508
0x1052c
-
注意事项
-
C++编译器不能以C的方式编译重载函数
-
编译方式决定函数名被编译后的目标名
-
C++编译方式将函数名和参数列表编译成目标名
-
C编译器只将函数名作为目标名进行编译