C++ 重载函数

C++ 重载函数·

https://blog.csdn.net/sherilindas/article/details/51678778

https://www.cnblogs.com/skynet/archive/2010/09/05/1818636.html

C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,即函数的参数列表不同,也就是说用同一个运算符完成不同的运算功能。这就是重载函数。重载函数常用来实现功能类似而所处理的数据类型不同的问题。

介绍·

  • 函数重载有什么好处?
    重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。当函数的编写者充分考虑了不同情况下应该运行稍有不同的函数,函数的使用者就不必为这些小细节而烦恼了。
    类的构造函数跟类名相同,也就是说:构造函数都同名。如果没有函数重载机制,要想实例化不同的对象,那是相当的麻烦!

  • 构成函数重载的条件如下:
    1、函数名相同。
    2、这些同名函数的形参(指参数的个数、类型)必须有其中一种不同,即参数列表不同。

    需要注意的是,返回值类型不同不构成重载函数

  • 重载函数的匹配原则:
    1、严格匹配,找到后就调用。
    2、没有找到严格匹配的函数,但是可以通过隐式转化,找到适合的重载函数。


通过隐式转换可以将double转为int,然后调用参数类型为int 的函数。
但是要注意一个问题,就是隐式转换的规则
而且要注意int到long和double,double到int和float的隐式转换,会引发二义性(ambiguous)。就是有两个都可行的选择,计算机无法替你做选择。

原理·

下面简单说说函数重载的原理
C++采用命名倾轧(name mangling)的技术来改变同名函数,以区分参数不同的函数。
例:

1
2
3
void name(char a);      // 通过倾轧->变成类似于void name_c;的形式。
void name(string a); // 通过倾轧->变成类似于void name_s;的形式。
void name(char a, int b); // 通过倾轧->变成类似于void name_ci;的形式。

name mangling 发生在两个阶段,一个是.cpp编译时,一个是.h的声明阶段。只有两个阶段同时进行才能匹配上。也就是要同时改名才可以。