本文内容取自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结
重载的概念
重载(Overload)
- 同一个标识符在不同的上下文有不同的意义
- 如:
-
“洗”和不同的词搭配后有不同的含义
如:洗衣服,洗脸,洗…
-
函数重载(Function Overload)
- 用同一个函数名定义不同的函数
- 当函数名和不同的参数搭配时函数的含义不同
编程实验
函数重载初探
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("Hello Func Overload!"));
25
26 return 0;
27 }
运行结果
通过实验结果可以看出,3个重名的函数都可以正常运行,函数发生了重载
函数重载至少满足以下一个条件
由于上面两个函数参数顺序不同,所以可以构成重载函数
当函数默认参数遇上函数重载会发生什么?
从语法来看,上面两个函数都符合main中func的调用。
运行结果:
可以看到,编译时报错了,重载出现了二义性,有两个候选函数符合调用要求
编译器调用重载函数的准则
- 将所有同名函数作为候选者
- 尝试寻找可行的候选函数
1.精确匹配实参
2.通过默认参数能够匹配实参
3.通过默认类型转换匹配实参 - 匹配失败
- 最终寻找到的候选函数不唯一,则出现二义性,编译失败。
- 无法匹配所有候选者,函数未定义,编译失败。
函数重载的注意事项
- 重载函数在本质上是相互独立的不同函数
- 重载函数的函数类型不同
- 函数返回值不能作为函数重载的依据
函数重载是由函数名和参数列表决定的!
小结
- 重载函数是C++中引入的概念
- 重载函数用于模拟自然语言中的词汇搭配
- 函数重载使得C++具有更丰富的主义表达能力
- 函数重载的本质为相互独立的不同函数
- C++中通过函数名和函数参数确定函数调用