解析c++中的重载问题

来源:互联网 发布:seo实战密码第一版pdf 编辑:程序博客网 时间:2024/06/01 09:26

我们都知道在c语言中不能出现相同的函数名,但是在c++中就可以,那么我们今天就来解析在c++中是如何实现重载的?

一、什么是函数重载

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

了解了函数重载的基本概念后,我们来看看在c++中编译器是如何实现函数重载的。

让我们来看看具体的相关代码吧!

#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(){    double b = Add(2.5, 3.4);    int c = Add(1, 2);    cout << "b=" << b << endl;    cout << "c=" << c<< endl;    return 0;}

此代码运行成功后的结果为“b=5.9 c=3”

我们首先要进行以下一系列步骤
打开你编译器中的解决资源方案管理器——右击工程名——点击属性——点击配合属性——点击链接器——点击调试——将生成映射文件的否改成是。

然后运行代码成功后,打开你这次代码所在工程的本地文件,打开debug文件夹你可以看见有一个文件后缀为.map的文件,打开它你可以在其中找见如下两行信息(vs编译器环境下)。

 ?Add@@YAHHH@Z            ?Add@@YANNN@Z 

我们通过一幅图来说明这两行内容代表的是什么

这里写图片描述

接着让我们来看看在linux环境中c++是如何实现函数重载的

相同的代码放入Linux环境中g++之后会生产a.out可执行文件然后输入如下命令:

这里写图片描述

就可以在显示的信息中找到如下信息:

这里写图片描述

接着我们再来看一副图:

这里写图片描述

两幅图未标记的部分是固定格式,我们不用关心。由此我们可以看出编译器在函数编译期间就对函数名进行的重新命名,由此我们也就明白了为什么重载函数的参数列表不同(个数不同/类型不同),返回值可同可不同。

上述就是为什么c++可以对函数实现重载,那我们来看看在c语言中对于函数名在.map文件中是如何处理的呢?

我们将代码改成c语言代码

#include<stdio.h>int Add(int a, int b){    return a + b;}int main(){    int c = Add(1, 2);    printf("%d", c);    return 0;}

代码运行成功后我们查看.map文件,发现编译器只是在程序的函数名前面加了一个“_” (_add),所以在c语言中函数名不能相同。

二、在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”?

C++语言支持函数重载,C 语言不支持函数重载。函数被C++编译后在库中的名字与C 语言的不同。
假设某个函数的原型为: void foo(int x, int y);
该函数被C 编译器编译后在库中的名字为_foo , 而C++编译器则会产生像_foo_int_int 之类的名字。
C++提供了C 连接交换指定符号extern“C”来解决名字匹配问题,用了extern“C”之后,代码运行之后就会去找被c语言编译之后的函数名去运行代码。