C++函数重载
1.多态之一——函数重载
在C中,每一个函数的名字是它的唯一标识,也就是说,在C语言中,不能有名字相同的两个函数。C++中,允许出现函数名相同,但函数特征标不同的函数。
2.函数特征标——形参列表(跟返回值无关)
i>重载条件
- 函数名相同
- 形参个数不同
- 若形参个数相同,则对应位置的参数类型不全相同
ii>注意
某一类型和他的引用类型不能重载
例:
void f(int );
void f(int &);
上述两个函数不能重载,原因是调用时,会出现二义性
3.重载函数的调用
i>调用最合适的
先来说类型匹配的情况
例:
void f(int &);
void f(const int &);
void f(int &&);
int a = 3;
const int b = 5;
f(a); //a为int型,与之匹配的是int &
f(b); //b为const int型,与之匹配的是const int &
f(a + b); //a + b是一个右值,与之匹配的是右值引用int &&
最合适的
//就拿上述例子来说
f(a);
//a是一个int型
//优先和int & 匹配
//如果没有f(int &),就调用f(const int &)
//f(int &&)与右值匹配,所以,直接绑定时不合法的
f(b);
//b时一个const int 型
//优先和 const int & 匹配
//如果没有f(const int &),非const引用无法绑定const左值
//所以,只有f(const int &)和他匹配
f(a + b);
//a + b是一个右值
//优先和f(int &&)匹配
//如果没有f(int &&),由于const int & 可以绑定一个临时变量,所以,也是匹配的
ii>类型不匹配——优先提升转换,然后标准转换
a.提升转换
bool、char、unsigned char、signed char、short 转换为 int
float 转换为 double
还有很多,不一一列举
b.标准转换
int -> char
double -> long
不一一列举
c.如果有多种转换方式,因为有多种调用方式,所以,会报错
例:
void f(int a);
void f(long a);
unsigned int a = 3;
f(a);
这里a的类型与上面的函数均不匹配,所以需要转换,然而,可以转换为int 也可以转换为long,这里出现了二义性,所以会报错