为何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——>两个参数都是整形
当函数返回类型不同时,编译后的名称相同,所以不能重载
补充问题
先回答一个问题?编译的时候为什么只有声明没有定义不会报错?
因为编译时只会在当前工程去找定义,如果没有找到定义找到函数就不找了,因为编译器认为这个函数的定义有可能在其他文件里面,先把编译时没有函数定义这个问题放过去,等到链接的时候再在其它文件查找,找不到在报错。
所以我们找出验证的方法是,写函数只给函数声明,不给函数定义,然后调用,链接是会出现错误