8-函数重载分析(上)
重载的概念
重载:
- 同一个标识符在不同的上下文有不同的意义
C++中的重载函数
函数重载:
- 用同一个函数名定义不同的函数
- 当函数名和不同的参数搭配时函数的含义不同
int func(int x) {
return x;
}
int func(int a, int b) {
return a + b;
}
int func(const char* s) {
return strlen(s);
}
【范例代码】函数重载初探
#include <stdio.h>
#include <string.h>
int func(int x) {
return x;
}
int func(int a, int b) {
return a + b;
}
int func(const char* s) {
return strlen(s);
}
int main(int argc, const char* argv[]) {
printf("%d\n", func(3));
printf("%d\n", func(4, 5));
printf("%d\n", func("D.T.Software"));
return 0;
}
函数重载至少满足下面一个条件:
- 参数个数不同
- 参数类型不同
- 参数顺序不同
【问题】当函数默认参数遇上函数重载会发生什么?
【范例代码】函数默认参数VS函数重载
#include <stdio.h>
int func(int a, int b, int c = 0) {
return a * b * c;
}
int func(int a, int b) {
return a + b;
}
int main(int argc, const char* argv[]) {
int c = func(1, 2);
return 0;
}
编译器调用重载函数的准则:
- 将所有同名函数作为候选者
- 尝试寻找可行的候选函数(1)精确配匹配参数(2)通过默认参数能够匹配实参(3)通过默认类型转换匹配实参
- 匹配失败(1)最终寻找到的候选函数不唯一,则出现二义性,编译失败(2)无法匹配所有候选者,函数未定义,编译失败
函数重载注意事项:
- 重载函数本质上是相互独立的不同函数
- 重载函数的函数类型不同
- 函数返回值不能作为函数重载的依据
【温馨提示】函数重载是由函数名和参数列表决定的。
【范例代码】函数重载的本质
#include <stdio.h>
int add(int a, int b) { // int(int, int)
return a + b;
}
int add(int a, int b, int c) { // int(int, int, int)
return a + b + c;
}
int main(int argc, const char* argv[]) {
printf("%p\n", (int(*)(int, int))add);
printf("%p\n", (int(*)(int, int, int))add);
return 0;
}