函数重载基本概念
// 什么叫函数重载
1. 同一作用域下,函数名相同,返回值类型相同,参数列表不同
2. 参数列表不同:参数的类型、个数、顺序不同。
void show(int a, long b) // 参数顺序不同的例子
{
cout << "1" << endl;
}
void show(long a,int b)
{
cout << "2" << endl;
}
void test()
{
long x = 1;
int a = 2;
show(a, x);
show(x, a);
}
// 函数重载的本质
- 本质上是2个独立的函数,主要靠函数名和形参列表区分开来
-
// 函数重载的内部实现
1. 用vcifld分别实现:void,char,int,float,long,double形参类型
2. void xxx(int a, char b, double d); // 底层函数名就是xxx_icd
3. 查看Linux中函数重载时发生的函数名字改编:
1. g++ test.cpp
2. nm test.o
// 函数重载与函数指针
- void(*FP)(int,int); // 定义函数指针
- FP=fun(10,20); // 正确
- FP=fun(10,20,1); // 调用错误
// 函数重载需要注意事项
- 若重载时加了默认参数,调用函数时可能导致二义性
- 函数名相同,返回值类型不同,不构成重载,编译错误
- C语言不支持函数重载
// 编译器调用重载函数的准则
- 将所有同名函数作为候选者
- 尝试寻找可靠的候选函数(3个条件同时进行)
- 精确匹配实参
- 通过默认参数匹配
- 通过默认参数类型转换匹配实参
- 匹配失败时
- 最终寻找到可行的候选函数不唯一,则出现二义性,编译失败
- 无法匹配所有的候选者,即函数未定义,编译失败
- 当使用重载函数名给函数指针赋值时
- 根据重载规则,挑选与函数名指针参数一致的候选者
- 严格匹配候选者形参类型与函数指针的函数形参类型
`