重载函数是函数的一种特殊情况, c++中允许在同一范围中声明几个功能类似的同名函数
函数重载的要求:
范例:
ERROR: 错误代码, 参数列表需不同
int fun(int a, int b){}
double fun(int a, int b){}True: 正确代码
void fun(int a, int b){} // 1
void fun(double a, double b){} // 2
void fun(double a, double b, char c){} // 3当调用函数时, 编译器会分析参数类型进行传参
例如上面这段代码, 如果定义时传入形参的a和b为int类型, 则会传到函数 1 , 如果定义时传入形参a和b为double类型, 则会传到函数 2
我们来试试下面这段代码:
#include
using namespace std;
int add(int a, int b) {
return a + b;
}
double add(double a, double b) {
return a + b;
}
double add(double a, double b, int c) {
return a + b;
}
int main() {
cout << add(1.2, 3.4, 8.9);
}这是一个简单的求和重载函数, 当我传入了3个变量, 但第三个变量并不符合函数定义形参类型
此时编译器依然选择了形参为3个的重载函数, 并且同时将错误的参数强转

上图可见: 调试结果, 调用了第三个重载函数, 并且c ( 9.8 ) 值强转为 int类型 ( 8 )
相同方式测试 char 等类型也如此
问题来了!!
#include
using namespace std;
int add(float a, float b) {
return a + b;
}
double add(int a, int b) {
return a + b;
}
int main() {
add(1.2, 3.4);
}我们已经知道, 函数调用时,如果函数的参数类型与传参类型不符, 编译时会自动强转, 但是如果像上面代码的情况,传入的参数1.2 , 3.4 默认都为double类型, double类型既可以强转为int类型,又可以强转为float, 那么到底应该强转为什么类型的, 计算机这时就无法进行判断了

!!!错误
以上这种情况就叫做二义性
解决二义性:
注: 编译器总是会把基本数据大的转为小的