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

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

参考文献:
[1]《C++全方位学习》范磊——第十章
[2]《C++程序设计教程(第二版)》钱能——第五章、第六章、第七章
[3]《C++ Primer(第5版)》王刚 杨巨峰——第一章、第六章
[4] 百度搜索关键字:C++函数、重载函数

你可能感兴趣的:(C++基础,C++函数机制,C++重载函数,重载函数的匹配)