[C++]重载函数

重载函数

重载函数(overloaded function)是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数。但是这些同名函数的形式参数(指参数的个数,类型)必须不同,也就是说用同一个函数名完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。
例如,从3个数中找出其中的最大者,而每次求最大数时数据的类型不同,可能是3个整数,3个双精度数或3个长整数。在c++语言中,需要设计出3个不同名的函数,其函数原型为:

int max1(int a,int b,int c);//求3个整数中的最大者
double max2(double a,double b,double c);//求3个双精度数中的最大者
long max1(long a,long b,long c);//求3个长整数中的最大者

C++允许用同一函数名定义多个函数,这些函数的参数个数和参数类型不同。这就是函数重载(overloading)。即同一个函数名重新赋予它新的含义,使一个函数名可以多用。
对上面求最大数的问题,可以编写如下c++程序:

/*求3个数中最大数*/
#include <iostream>
using namespace std;
int max(int a,int b,int c);
double max(double a,double b,double c);
long max(long a,long b,long c);
int main(void)
{
    int i1,i2,i3,i;
    cout<<"请输入3个数"<<endl;
    cin>>i1>>i2>>i3;
    i = max(i1,i2,i3);
    cout<<"i_max = "<<i<<endl;
    double d1,d2,d3,d;
    cout<<"请输入3个数"<<endl;
    cin>>d1>>d2>>d3;
    d = max(d1,d2,d3);
    cout<<"d_max = "<<d<<endl;
    long g1,g2,g3,g;
    cout<<"请输入3个数"<<endl;
    cin>>g1>>g2>>g3;
    g = max(g1,g2,g3);
    cout<<"g_max = "<<g<<endl;
}
int max(int a,int b,int c){
    if(b>a){
        a = b;
    }
    if(c>a){
        a = c;
    }
    return a;
}
double max(double a,double b,double c){
    if(b>a){
        a = b;
    }
    if(c>a){
        a = c;
    }
    return a;
}
long max(long a,long b,long c){
    if(b>a){
        a = b;
    }
    if(c>a){
        a = c;
    }
    return a;
}

运行结果如下;
20221227_1
上例3个max函数体使相同的,其实重载函数并不要求函数体相同。重载函数处了允许参数类型不同以外,还允许参数的个数不同。
编写一个程序,用来求2个整数或3个整数中的最大数。如果输入2个整数,程序就输出这两个整数中的最大值;如果输入3个整数,程序就输出这3个整数中的最大值。

#include <iostream>
using namespace std;
int max(int a,int b,int c);
int max(int a,int b);
int main(void)
{
    int a = 8,b = -12,c = 27;
    cout<<"max(a,b,c) = "<<max(a,b,c)<<endl;
    cout<<"max(a,b) = "<<max(a,b)<<endl;
    return 0;
}
int max(int a,int b,int c)
{
    if(b>a){
        a = b;
    }
    if(c>a){
        a = c;
    }
    return a;
}
int max(int a,int b){
    if(a>b){
        return a;
    }else{
        return b;
    }
}

运行结果如下:
20221227_2
两次调用max函数参数个数不同,系统就根据参数的个数找到与之匹配的函数并调用它。
参数的个数和类型可以都不同。但不能只有函数的类型不同而参数的个数和类型相同。
例如:

int f(int);//函数返回值为整形
long f(int);//函数返回值为长整型
void f(int);//函数无返回值

在函数调用时都是同一形式,如’f(10)',编译系统无法判断应该调用哪一个函数。重载函数的参数个数,参数类型2者中至少有一种不同,函数返回值类型可以相同也可以不同。
在使用重载函数时,同名函数的功能应相同或相近,不要用同一函数名去实现完全不相同或者相反的功能,虽然程序也能运行,但是缺乏可读性,也不符合函数重载的设计规则。
此外,在设计重载函数时要避免一下情形:

void add(int x,int y = 2,int z = 3);
void add(int x,int y = 2);

在这种情况下,如果调用函数add(1),编译器将给出如下错误:

“ambiguous call to overloaded function”

原因是此时的编译器无法确定调用第一个函数还是第二个函数,出现了二义性问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值