1. 函数重载
1.1 函数重载的定义
函数重载就是两个以上的函数,取相同的函数名,但是形参的个数和类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动决定调用哪一个函数。1
1.1函数重载的示例
例如:
int max(int,int);
int max(int,int,int);
float max(float,float);
double max(double,double);
函数重载示例:
/******************************
* 函数的重载 *
*******************************/
#include<iostream>
using namespace std;
int add(int x,int y) //函数重载
{
cout<<"(int, int)\t";
return x+y;
}
double add(double x,double y)//函数重载
{
cout<<"(double, double)\t";
return x+y;
}
int add(int x,double y)//函数重载
{
cout<<"(int, double)\t";
return int(x+y);
}
double add(double x,int y) //函数重载
{
cout<<"(double,int)\t";
return x+y;
}
int main()
{
cout<<add(9,8)<<endl;
cout<<add(9.0,8.0)<<endl;
cout<<add(9,8.0)<<endl;
cout<<add(9.0,8)<<endl;
return 0;
}
2. 函数重载注意事项
- 各个重载函数的返回类型可以相同,也可以不同。但如果函数名相同、形参表也相同,仅仅是返回类型不同,则是非法的。在编译时会认为是语法错误。
// C++无法区分这两个函数。因为在没有确定函数调用是对哪一个重载的函数之前,//返回类型是不知道的。
int add(int i1,int i2);
float add(int f1,int f2);
- 确定对重载函数的哪个函数进行调用的过程称为绑定(binding), 绑定的优先次序为精确匹配、对实参的类型向高类型转换后的匹配、实参类型向低类型及相容类型转换后的匹配。
//将char型转换成int型,然后与add(int,int)绑定。
add('A','A'+'0');
//函数实参向(double,double)转换,然后与add(double,double)绑定。
add(float(8),float(9));
//实参类型为(long double, int),向低类型转化。
add(long double(8),9);
3 重载函数的二义性
3.1 绑定(匹配)二义性
两个重载函数,编译器不知道进行哪种类型的转换,与哪个函数绑定,这种现象就叫绑定(匹配)二义性。
3.2 消除二义性
消除这种二义性的办法有:
- 添加重载函数定义,使调用获得精确匹配。如:增加定义
add(long double,int)
- 将函数的实参进行强制类型的转换,使调用获得精确匹配。
例如:调用形式可改为add(double(long double(8)),9)
,但改为add(long double(8),long double(9))
同样出现绑定二义性。
3.3 注意事项
重载函数与带默认形参值的函数一起使用时,有可能引起二义性。
例如:
void add(int x, int y, int z=0);
当调用add(8,9)
时,不知是和add(int,int)
绑定,还是和add(int,int,int=0)
绑定?消除这种二义性的办法是增加或减少实参个数。
本教程仅供教学使用,参考教材 :《C++语言程序设计教程》,杨进才、沈显君编著,清华大学出版社,2022年1月第4版 ↩︎