c++第一次作业

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<<maxNumber(1,2)<<endl;
    return 0;
}

当主函数在调用时,如果没有重载函数,只有一个函数,比如①中,编译器会将不符合的第二个参数2,强制转化为2.0f。可当有重载函数②时,两个函数都不是完美符合参数类型的,那么编译器是将①中的第二个参数变为2.0f,还是将②中的第一个参数1变为1.0f呢?这个时候编译器就会报错,也就是二义调用。

posted @ 2019-09-15 15:14  醉死的乌鸦  阅读(232)  评论(0编辑  收藏  举报