对于在不同类型上作不同运算而又用同样名字的情况,称之为重载,也就是一物多用
例如:
int abs(int);
long labs(long);
double fabs(double);
若用重载,可以改为:
int abs(int);
long abs(long);
double abs(long);
c++中用一种函数命名技术可以准确判断出该用哪个abs()函数。
abs(-10);//调用int abs(int);
abs(-1000000);//调用long abs(long);
abs(-12.23);//调用double abs(double);
匹配重载函数的顺序
- 寻找一个严格的匹配,若找到即用这个函数
- 通过内部转换寻求一个匹配,找到即用此函数
- 通过用户定义的转换寻求一个匹配,若能查出有唯一的一组转换,即用此函数
例如:
重载函数print()的匹配
void print(double);
void print(int);
void fun()
{
print(1);//匹配void print(int)
print(1.0);//匹配void print(double)
print('a');//匹配void print(int);
print(3.1415f);//匹配void print(double);
}
c++允许int到long,int到double的转换,当实参是整数,而重载函数一为long型参数,一为double型参数时,应该给予一个显式转换
void print(long);
void print(double);
void fun(int a)
{
print(a);//error,具有二义性
}
应当指明时是print(long(a));还是print(double(a));,以分辨这种混淆的调用
- 重载函数的参数个数、参数类型或参数顺序三者至少有一种不同,函数返回值可以相同也可以不同
默认参数可以将一系列简单的重载函数合成为一个:
void point(int,int){//...}
void point (int a){return point(a,4);}
void (){return point(3,4);}
void point(int=3,int=4);//可以用此含有默认参数的函数代替
当调用point()时,即调用point(3,4),它是第三个声明的重载函数
当调用point(6)时,即调用point(6,4),它时第二个声明的重载函数
当调用point(7,8)时,即调用第一个声明的重载函数
如果一组函数都允许相同实参个数的调用,将会引起调用的二义性
- 当又有声明又有定义时,定义中不允许默认参数
- 允许函数默认参数值,是为了让编程简单
- 如果一个函数中有多个默认参数,则形参分布中,默认参数应从右至左逐渐定义,调用函数时,只能向左匹配参数
- 默认值可以是全局变量,全局常量甚至是一个函数,但不可以是一个局部变量