【C++笔记】C语言为什么不能函数重载

函数重载

一、

1、原因:C语言不能函数重载与函数编译后函数名有关。
2、C语言编译后的代码名称为”_函数名”

//C语言

int Add(int a,int b);  //这里是有意只给声明不给定义,
int Add(int a,char b); //出错后会在显示框显示编译后的函数名
int Add(char a,int b);

int main()
{
    Add(1,2);
    Add(1,'2');
    Add('1',2);
    return 0;
}

下图为编译后的结果
这里写图片描述
编译后函数名变化只是在原来的函数名前加了一个下划线,所以当同名的函数参数不同时,编译器无法解析到他们的不同,因为它们编译后的名称都相同,所以C语言不能函数重载。

3、C++为什么可以函数重载

#include <iostream>

int add(int a,int b);
int add(int a,char b);
int add(char a,int b);

int main()
{
    add(1,2);
    add(1,'1');
    add('1',2);
    return 0;
}

编译结果如图所示
这里写图片描述
由上图分析,因为C++同名参数不同的函数编译完函数名称不同,所以可以函数重载。
问题:只有返回值类型不同时,为什么不能函数重载?
只有返回值类型不同时,编译后的名称也不相同,为什么不能重载
1、只有返回值不同的函数,在调用时编译器不知道该调用那个。
2、每个编译器编译后的函数名称转换方式不同

  • linux下是这样的Add3_i _i
  • Add—–>函数名
  • 3——–>函数名有几个字符
  • _i _i——>连个参数都是整形
  • 当函数返回类型不同时,编译后的名称相同,所以不能重载

4、补充问题
先回答一个问题?编译的时候为什么只有声明没有定义不会报错?
因为编译时只会在当前工程去找定义,如果没有找到定义找到函数声明就不找了,因为编译器认为这个函数的定义有可能在其他文件里面,先把编译时没有函数定义这个问题放过去,等到链接的时候再在其它文件查找,找不到在报错。
所以我们找出验证的方法是,写函数只给函数声明,不给函数定义,然后调用,链接是会出现错误

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值