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; }