想知道c++中为什么支持函数重载,函数重载的底层原理是什么?为什么c++支持而c不支持?不妨进来看看。

<一>函数重载

先来介绍一下函数重载是什么。函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数 或 类型 或 类型顺序)不同,常用来处理实现功能类似数据类型 不同的问题。

int Add(int x1, int x2){
	return x1 + x2;
}

//参数数量不同
int Add(int x1, int x2, int x3){
	return x1 + x2 + x3;
}

//参数类型不同
double Add(double x1, double x2){
	return x1 + x2;
}


//参数顺序不同
void fun(int x, char y){
	printf("fun(int x, char y)");
}
void fun(char x, char y){
	printf("fun(char x, char y)");
}


int main(){
	printf("%d", Add(2, 3));
	printf("%d", Add(2, 3, 4));
	printf("%lf", Add(2.0, 3.0));
	fun(1, 'a');
	fun('a', 1);
	return 0;
}

注意:

  • 函数重载可以给缺省值。但是要注意 fun(全缺省) 和 fun(无参) 这种虽然也叫函数重载但是无参调用的时候会造成二义性的问题。建议不要这样写。
  • 在c++中的输入(cin)输出(cout)能够自动识别类型 ,其实底层运用的函数重载的问题。

<二>函数重载的原理

我们有时候会想为什么c++支持函数重载,而c语言却不支持函数重载(在C语言中函数名不可以是相同的)。

这里先给大家拓展一下一个程序要运行起来需要经理的阶段。一般需要四个阶段:预处理,编译,汇编,链接。

没个阶段主要做什么我就不详细讲解了 ,建议自己去查一下,网上有很多的文章。

这里不一样c和c++不一样的一点就是函数名的修饰规则(name mangling)不一样。

在c语言中函数的修饰规则就是函数名,用函数名来唯一决定确定一个函数

在c++中会把参数也修饰进函数的修饰规则,

这里我们一g++和gcc为例,vs下函数的修饰规则太复杂了 。

在g++中

 在gcc中

 可以看到c++,在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参 数类型信息添加到修改后的名字中。通过函数修 饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

而c语言不会只有函数名没有参数的相关信息。自然不能支持函数重载。

  • 注意:
  • 如果两个函数函数名和参数是一样的,返回值不同是不构成重载的,因为调用时编译器没办 法区分
  • 返回值不同是函数重载的原因是:调用的地方可以指定函数的参数,但是却无法指定函数的返回值。不支持重载的原因是调用的时候存在二义性,无法区分。

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小峰同学&&&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值