为何c++支持函数重载而c语言不支持

为何c++支持函数重载而c语言不支持

c和c++都属于编译型语言,也就是说着两种语言都需要经过编译、链接两个步骤才能够执行。

如下图:
这里写图片描述

那么问题就出在编译这个环节上。

c语言在编译器编译的时候,在库中的名字为:_function
而c++在编译器编译以后,在库中的名字是:_function_x
也就是说,c语言如果遇到重名函数,链接的时候就会报错
而c++会根据修饰规则进行选择,因为编译后的名字是不一样的。

比如两个函数声明:

1)void f(int x, int y)
2)void f()
结论:
c语言在编译后都是: _f
而c++是: _f 和 _f_int_int

总结:

  C语言,在符号表中的函数标识是函数本身,就会存在两个同名函数。
C++,不是用原生的函数名,是函数名+参数(c++有函数名修饰规则,函数名+类型一起决定)

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

//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语言不能函数重载。

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,'2');
    add('1',2);
    return 0;
}

这里写图片描述

这里写图片描述

由上图分析,因为C++同名参数不同的函数编译完函数名称不同,所以可以函数重载。

问题:只有返回值类型不同时,为什么不能函数重载?
只有返回值类型不同时,编译后的名称也不相同,为什么不能重载
1、只有返回值不同的函数,在调用是编译器不知道该调用那个。
2、每个编译器编译后的函数名称转换方式不同

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

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

猜你喜欢

转载自blog.csdn.net/fighthha/article/details/81158571