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))。