#Overloading Function(函数重载)
引入
阅读以下代码:
int max(int num1,int num2){
if(num1 > num2)
return num1;
else
return num2;
}
可以看出,如果我在主函数的调用时输入非int型参数,如max(1.2,1.1) ,那么这个编译将不会通过,为解决这个问题,c++增加了重载机制,使得我们能处理多种类型的信息,也减少了代码量。
针对以上问题,我们可以重新写个函数:
double max(double num1,double num2){
if(num1 > num2)
return num1;
else
return num2;
}
在这个函数中,参数的类型不同,但函数体和函数名是相同的。
那么编译器是如何匹配重载函数的调用的呢?
答:只看参数:个数、类型、顺序
①
double max(double num1,double num2,int num3){
if(a>b) /*如果a大于b,借助中间变量t实现a与b值的互换*/
{
t = a;
a = b;
b = t;
}
if(a>c) /*如果a大于c,借助中间变景t实现a与c值的互换*/
{
t = a;
a = c;
c = t;
}
if(b>c) /*如果b大于c,借助中间变量t实现b与c值的互换*/
{
t = b;
b = c;
c = t;
}
return c;
}
②
double max(int num1,double num2){
if(num1 > num2)
return num1;
else
return num2;
}
③
double max(double num1,int num2){
if(num1 > num2)
return num1;
else
return num2;
}
例1:在主函数中调用:max(1 , 1.2)、max(1.2 , 1)、max(1.2 ,1.3 ,4 )分别调用的是以上哪个函数?
答:分别是②、③、①
例2:
int fun1(int x ,int y)
{return x;}
void fun2(int a ,int b)
{return a}
以上两个函数可否组成重载函数?
答:不可以,重载函数不以返回值类型区分。
##Ambiguous Invocation(二义调用)
- 某函数调用有多个匹配项,但编译器无法确定正确的匹配项(二义调用会导致编译错误)
重载①
int maxNumber(int num1 , double num2){
if(num1 > num2)
return num1;
else
return num2;
}
重载②
double maxNumber(double num1 , int num2){
if(num1 > num2)
return num1;
else
return num2;
}
主函数
int main(){
cout<
当主函数在调用时,如果没有重载函数,只有一个函数,比如①中,编译器会将不符合的第二个参数2,强制转化为2.0f。可当有重载函数②时,两个函数都不是完美符合参数类型的,那么编译器是将①中的第二个参数变为2.0f,还是将②中的第一个参数1变为1.0f呢?这个时候编译器就会报错,也就是二义调用。