重载函数
重载函数(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;
}
运行结果如下;
上例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;
}
}
运行结果如下:
两次调用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”
原因是此时的编译器无法确定调用第一个函数还是第二个函数,出现了二义性问题。