在程序中,一个函数就是一个操作的名字。
两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是函数的重载。
如果没有重载机制,那么对不同类型的数据进行相同的操作也需要定义名称完全不同的函数。例如定义加法函数,就必须这样对整数的加法和浮点数的加法使用不同的函数名:
int iadd(int x,int y);
float fadd(float x,float y);
这在调用时实在是不方便。
C++允许功能相近的函数在相同的作用域内以相同函数名定义,从而形成重载。
注意 重载函数的形参必须不同:个数不同或者类型不同。
编译程序对实参和形参的类型及个数进行最佳匹配,来选择调用哪一个函数。如果函数名相同 ,形参类型也相同(无论函数返回值类型是否相同),在编译时会被认为是语法错误(函数重复定义 )。
例如:
(1)int add(int x,int y);
float add(float x,float y);
形参类型不同
(2)int add(int x,int y);
int add(int x,int y,int z);
形参个数不同
例如:
(1)int add(int x,int y); int add(int a,int b); //错误!编译器不以形参名来区分函数
(2)int add(int a,int y); void add(int x,int y);//错误!编译器不以返回值来区分函数
习惯 不要将不同功能的函数定义为重载函数,以免出现对调用结果的误解、混淆。例如:
int add(int x,int y){return x+y;}
float add(float x,float y){return x-y;}
当使用具有默认形参值的函数重载形式时,需要注意要防止二义性。例如下面的两个函数原型,在编译时便无法区分为不同的重载形式:
void fun(int length,int width=2,int height=3);
void fun(int length);
也就是说,当以下面形式调用函数fun时,编译器无法确定应该执行哪个重载函数:
fun(1);
这时编译器会指出语法错误。
例 重载函数应用举例
编写两个名为sumOfSquare的重载函数,分别求两整数的平方和及两实数的平方和
#include<iostream>
using namespace std;
int sumOfSquare(int a,int b)
{
return a*a+b*b;
}
double sumOfSquare(double a,double b)
{
return a*a+b*b;
}
int main()
{
int m,n;
cout<<"Enter two integer:";
cin>>m>>n;
cout<<"Their sum of square:"<<sumOfSquare(m,n)<<endl;
double x,y;
cout<<"Enter two real number:";
cin>>x>>y;
cout<<"Their sum of square:"<<sumOfSquare(x,y)<<endl;
return 0;
}