函数重载解析

来源:互联网 发布:淘宝左右香水是正品吗 编辑:程序博客网 时间:2024/05/16 10:24

                                                           C++函数重载的实现原理

1.函数重载的概念

       在同一个作用域类,一组函数的函数名相同,参数列表不同(参数个数不同/参数类型不同),返回值可同可不同。

2.函数重载的作用

       用来在同一个作用域内,用同一个函数名,命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,增强了程序的可读性。

3.函数重载的原理

  编译器在编译.cpp文件时,会把当前使用的作用域里的同名函数,根据函数形参的类型和顺序会对函数进行重命名(不同的编译器的重命名标准不一样,但是他们都会把文件中同一个函数名进行重命名。)


用下面的代码分析不同编译器下内部不同的命名方式

#include<iostream>using namespace std;int Add(int a, int b){return a + b;}double Add(double a, double b){return a + b;}int main(){Add(3, 4);Add(5.2, 3.6);cout << "Add(3, 4)=" << Add(3, 4) << endl;cout << "Add(5.2, 3.6)=" << Add(5.2, 3.6) << endl;system("pause");return 0;}

vs编译器

      根据返回值类型(不起决定性作用)+形参类型和顺序(起决定性作用)的规则重命名并记录在.map文件中。

查看方式:“项目”->“属性”->“链接器”->“调试”->“生成映射文件”,选择“是”。然后在当前的项目Debug文件里查看.map文件,结果如下:


      从图中可以看出,虽然两个函数的函数名相同,但是他们在符号表中生成的名称不一样,这样构成函数重载。

‘?’表示名称开始,“@@YA”表示参数表开始,“HHH” “NNN”表示返回值类型,两个参数类型,“@Z”表示名称结束。

Linux g++编译器

根据函数名字的字符数+形参类型和顺序的规则重命名记录在符号表中。

当外面的函数被调用时,便会根据记录的结果去寻找符合要求的函数名,进行调用。

 


原创粉丝点击