C++——为什么C++支持函数重载而C语言不支持

作者:小 琛
欢迎转载,请标明出处

什么是函数重载

double Add(double left, double right)
 {
 return left+right; 
 }
long Add(long left, long right) 
{
 return left+right; 
 }

例如上面的代码,Add函数的函数名字重复,但参数不同(包括参数的个数、类型不同)的函数。
这种情况在C语言的编译中是不通过的,但C++却可以。接下来我们来讲解原因

程序编译过程中的第四步:链接

  1. 实际我们的项目通常是由多个头文件和多个源文件构成,而通过我们C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。那么怎么办呢?
  2. 所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。
  3. 那么链接时,面对Add函数,连接器会使用哪个名字去找呢?
    在这里插入图片描述
    借助Linux可以看到,使用C语言的编译gcc的时候,遇到Add函数,编译器仍然是以函数名本身Add去寻找该函数的实体,而当两个函数名字相同仅仅是参数不同的时候,是无法辨别的,因此会出现错误
    在这里插入图片描述
    上图是Linux下g++编译,我们看到,编译器将Add函数变成了:Z3Addii
    这里的Z3是C++编译特征,重点在于后面的 ii ,这里的ii其实就是int int ,也就是说C++编译的时候会将函数的参数当作该函数的固有特征,并结合函数名去寻找,这也就解释了当函数名相同但参数不同的时候,编译器可以分辨出两个函数的不同。

注意:结合上述所讲,我们不难得到,其实二者最大的区别就是C++编译的时候去call某个函数,会将函数参数作为其本身的一个特征,但函数的返回值并没有该点。因此常常会有笔试这样考:写了两个函数,名称参数相同但返回值不同,问是否为重载函数,答案当然不是。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值