重载之函数重载

时间:2022-02-10 20:17:47

      重载函数是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,函数的重载其实就是"一物多用"的思想(这里指的"物"是"函数名")。但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。

两个重载函数必须在下列一个或两个方面有所区别:

1、函数有不同参数。

2、函数有不同参数类型,

例如:

求两个数的最大值;

int max(int a,int b);
double max(double a,double b)
int float(float a,float b)

它们具有相同的函数名,而它们的类型不同。所以它们称为函数的重载。

在运行的时候,编译器根据用户提供的数据来判断具体执行哪一个函数。 

编译器判断重载函数的第一步是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function)。所谓候选函数就是与被调用函数同名的函数。上面的前四个函数都可以成为候选函数(当然可以是多个),而唯有Max ( int , int ) 被排除在外了。

编译器判断重载函数的第二步分为两动作。第一个动作是编译器从第一步选出的候选函数中调出可行函数(viable function)。可行函数的函数参数个数与调用的函数参数个数相同(如S ( int )),或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的缺省值(如 S (double , double =1.2 );)第二个动作是根据参数类型的转换规则将被调用的函数实参转换(conversion)成候选函数的实参。这里本着充分利用参数类型转换的原则,换句话说,尽可能的使用上参数类型转换。当然转换要以候选函数为转换的目标。上面的函数中只有两个是可行函数,它们分别是S ( int ); S ( double , double )。

如果依照参数转换规则没有找到可行函数,则该调用就是错误的,则说没有函数与调用匹配,属于无匹配情况(no match function)。

编译器判断重载函数的第三步是从第二步中选出的可行函数中选出最佳可行函数(best match situation)。在最佳可行函数的选择中,从函数实参类型到相应可行函数参数所用的转化都要划分等级,根据等级的划分(ranked),最后选出最佳可行函数。

下面我们以一个具体的实例来说明它:

例:1.用重载函数实现两个整数、三个整数、两个实型数、三个实型数的排序,按照从小到大的顺序将排序结果输出。
1) 声明函数sort为重载函数,并根据参数个数、类型的不同分别进行定义;
2) 在main中用cin分别输入两个整数、三个整数、两个实型数、三个实型数;

3)根据参数个数、类型的不同,调用不同的函数,从而实现重载

#include<iostream>
using namespace std;

void sort(int a,int b)
{
if(a>b)
{
cout<<b<<"<"<<a<<endl;
}
else if(a<b)
{
cout<<a<<"<"<<b<<endl;
}
else
{
cout<<a<<"="<<b<<endl;
}
}
void sort(int a,int b,int c)
{
if(a>b&&a>c)
{
if(b>c)
{
cout<<c<<"<"<<b<<"<"<<a<<endl;
}
else if(b==c)
{
cout<<b<<"="<<c<<"<"<<a<<endl;
}
else
{
cout<<b<<"<"<<c<<"<"<<a<<endl;
}
}
if(b>a&&b>c)
{
if(a>c)
{
cout<<c<<"<"<<a<<"<"<<b<<endl;
}
else if(c==a)
{
cout<<c<<"="<<a<<"<"<<b<<endl;
}
else
{
cout<<a<<"<"<<c<<"<"<<b<<endl;
}
}
if(c>a&&c>b)
{
if(a>b)
{
cout<<b<<"<"<<a<<"<"<<c<<endl;
}
else if(b==a)
{
cout<<b<<"="<<a<<"<"<<c<<endl;
}
else
{
cout<<a<<"<"<<b<<"<"<<c<<endl;
}
}
if(a==b&&b>c)
{
cout<<c<<"<"<<a<<"="<<b<<endl;
}
if(a==c&&c>b)
{
cout<<b<<"<"<<a<<"="<<c<<endl;
}
if(b==c&&b>a)
{
cout<<a<<"<"<<b<<"="<<c<<endl;
}
if(a==b&&b==c)
{
cout<<a<<"="<<b<<"="<<c<<endl;
}
}
void sort(double a,double b)
{
if(a>b)
{
cout<<b<<"<"<<a<<endl;
}
else if(a<b)
{
cout<<a<<"<"<<b<<endl;
}
else
{
cout<<a<<"="<<b<<endl;
}
}
void sort(double a,double b,double c)
{
if(a>b&&a>c)
{
if(b>c)
{
cout<<c<<"<"<<b<<"<"<<a<<endl;
}
else if(b==c)
{
cout<<b<<"="<<c<<"<"<<a<<endl;
}
else
{
cout<<b<<"<"<<c<<"<"<<a<<endl;
}
}
if(b>a&&b>c)
{
if(a>c)
{
cout<<c<<"<"<<a<<"<"<<b<<endl;
}
else if(c==a)
{
cout<<c<<"="<<a<<"<"<<b<<endl;
}
else
{
cout<<a<<"<"<<c<<"<"<<b<<endl;
}
}
if(c>a&&c>b)
{
if(a>b)
{
cout<<b<<"<"<<a<<"<"<<c<<endl;
}
else if(b==a)
{
cout<<b<<"="<<a<<"<"<<c<<endl;
}
else
{
cout<<a<<"<"<<b<<"<"<<c<<endl;
}
}
if(a==b&&b>c)
{
cout<<c<<"<"<<a<<"="<<b<<endl;
}
if(a==c&&c>b)
{
cout<<b<<"<"<<a<<"="<<c<<endl;
}
if(b==c&&b>a)
{
cout<<a<<"<"<<b<<"="<<c<<endl;
}
if(a==b&&b==c)
{
cout<<a<<"="<<b<<"="<<c<<endl;
}
}


int main()
{
int i,j,k;
double m,n,q;

cout<<"两个整数的比较请输入数据"<<endl;
cin>>i>>j;
sort(i,j);
cout<<"三个整数的比较请输入数据"<<endl;
cin>>i>>j>>k;
sort(i,j,k);
cout<<"两个实数的比较请输入数据"<<endl;
cin>>m>>n;
sort(m,n);
cout<<"三个实数的比较请输入数据"<<endl;
cin>>m>>n>>q;
sort(m,n,q);
return 0;
}

这个实例是通过重载函数定义四个具有相同函数名的重载函数。这些函数有些是数据类型同其他不同,有的是数据个数不同。更有的是,数据的类型和个数都不同。如果没有重载函数我们是无法使用同一个函数名同时给四个函数定义。所以,重载函数就是“一物多用”,比较方便。