您的位置:首页 > 编程语言 > C语言/C++

C++基础---重载函数

2015-09-03 22:00 253 查看

1. 重载函数

1.1 重载函数的定义

重载函数:是函数的一种特殊情况,为方便使用,C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数;

重载函数:常用来实现功能类似而所处理的数据类型不同的问题;

1.2 编译器判断调用的重载函数

编译器判断重载函数的第一步:是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function);

注:候选函数就是与被调用函数同名的函数。

编译器判断重载函数的第二步:是编译器从第一步选出的候选函数中调出可行函数(viable function);

注:可行函数的函数参数个数与调用的函数参数个数相同,或者可行函数的参数可以多一些,但是多出来的函数参数都要有相关的缺省值。

编译器判断重载函数的第三步:是根据参数类型的转换规则将被调用的函数实参转换(conversion)成候选函数的实参;

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

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

1.3 重载函数的匹配

只要参数个数不同,参数类型不同,参数顺序不同,函数就可以重载。然而,返回类型不同则不允许函数重载。

例一:
void func(int a);//ok
void func(char a);//ok
void func(char a, int b);//ok
void func(int a, char b);//ok
char func(int a);//no 与第一个函数冲突
注:因为调用函数是只看参数匹配的,有的函数虽有返回类型,但不参与表达式运算而单独作为一条语句,因此函数的匹配不能根据上下文来判断。如:fun(23);无法确定是调用void func(int)还是调用char func(int)。


例二:
void print(double);
void print(int);
void func()
{
print(1);//匹配void print(int);
print(1.0);//匹配void print(double);
print('a');//匹配void print(int);
print(3.1415f);//匹配void print(double);
}


例三:
void print(long a);
void print(double a);
void func(int a)
{
print(a);//错,long型与double型匹配参数二义性</font>
}
注:C++允许int型到long型,int型到double型的隐式转换。但若必须在两者之间抉择时,则会引起错误。例如,当实参是整数,而重载函数一为long型参数,一为double型参数时,就会产生二义性,应在调用的时候显式表明是print(long(a))还是print(double(a))。


参考文献:

[1]《C++全方位学习》范磊——第十章

[2]《C++程序设计教程(第二版)》钱能——第五章、第六章、第七章

[3]《C++ Primer(第5版)》王刚 杨巨峰——第一章、第六章

[4] 百度搜索关键字:C++函数、重载函数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: