关键词: 重载、 函数重载、 函数重载的本质
1. 重载的概念
-
重载(overload)
- 同一个标识符在不同的上下文有不同的意义
-
函数重载(Function Overload)
- 用同一个函数名定义不同的函数
- 当函数名和不同的参数搭配时,函数的含义不同
int func(int x)
{
return x;
}
int func(int a, int b)
{
return a + b;
}
int func(const char* s)
{
return strlen(s);
}
- 函数重载至少满足下面的一个条件:
- 参数个数不同
- 参数类型不同
- 参数顺序不同
2. C++中的函数重载
- 当函数默认参数遇上函数重载会发生什么?
#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, char* argv[])
{
int c = func(1, 2); // which one?
return 0;
}
输出结果:
test.c: In function ‘int main(int, char**)’:
test.c:16:19: error: call of overloaded ‘func(int, int)’ is ambiguous
int c = func(1, 2);
^
test.c:16:19: note: candidates are:
test.c:3:5: note: int func(int, int, int)
int func(int a, int b, int c = 0)
^
test.c:8:5: note: int func(int, int)
int func(int a, int b)
总结:特性之间的冲突,在今后的编程中需要注意这样的特性冲突。
- 编译器调用重载函数的准则
- 将所有同名函数作为候选者
- 尝试寻找可行的候选函数
- 精确匹配实参
- 通过默认参数能够匹配实参
- 通过默认类型转换匹配实参
- 匹配失败
- 最终寻找到的候选函数不唯一,则出现二义性,编译失败。
- 无法匹配所有的候选者,函数未定义,编译失败。
3. C++中的函数重载
- 重载函数本质上是相互独立的不同函数
- 重载函数的函数类型不同
- 函数重载是由函数名和参数列表决定的,与返回值没有关系,即函数返回值不能作为函数重载的依据
编程说明:函数重载的本质
#include <stdio.h>
#define LOG_INT(i) printf("%s = %d\n", #i, i);
#define LOG_POINTER(p) printf("%s = %p\n", #p, p);
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()
{
LOG_INT(add(1, 2));
LOG_POINTER((int(*)(int, int))add);
LOG_INT(add(1, 2, 3));
LOG_POINTER((int(*)(int, int, int))add);
return 0;
}
输出结果:
add(1, 2) = 3
(int(*)(int, int))add = 0x804841d
add(1, 2, 3) = 6
(int(*)(int, int, int))add = 0x804842a
4. 小结
- 函数重载是C++中引入的概念
- 函数重载用于模拟自然语言中的词汇搭配
- 函数重载使得C++具有更丰富的语义表达能力
- 函数重载的本质为相互独立的不同函数
- C++中通过函数名和函数参数确定函数调用
声明:此文章仅是本人在学习狄泰学院《C++深度解析教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3)