C++——函数重载的原理,为何重载,如何重载

定义

如果同一个作用域下的几个函数名相同的函数,他们的参数不同,具体表现在:类型不同,数量不同,类型的顺序不同,则称之为函数的重载(overloaded)

示例

在这里插入图片描述
在C语言中,写一个交换两个数的函数需要大动干戈。
在这里插入图片描述
而C++因为这种特性,使得编程的时候方便了许多。
这些函数接收的形参的类型不同,但是功能是一样的,调用这个函数时,编译器就会根据所传类型自动推导要调用的函数,先是编译,后再去链接对应的函数。这个过程称为重载决策

但是不能重载除了返回值类型不同,其他要素都相同的函数。返回值不是构成函数重载的要素。
在这里插入图片描述
这种替换类型名的方式也不构成重载,因为本质还是int这个类型,myint不是一个新的类型。
在这里插入图片描述

C++如何支持函数重载?

程序在汇编的时候,会将函数和其所在的地址形成映射关系,以便在链接的时候可以更快地根据函数名找到函数所在的地址。而生成的存放这种关系的东西就叫符号表
我们在Linux环境下编写两个文件,一个是C语言语法,一个是C++语法,之后分别用gcc和g++编译器编译。
C语言文件中写一个myswap函数,然后用objdump -d 指令查看反汇编中要执行的那些命令的section,可以看到这个函数在符号表中的命名方式是按函数名原名
如果有多个同名的函数存在,那么就以为着有多个与不同地址之间的映射关系,因此就会有命名的冲突
在这里插入图片描述

在这里插入图片描述
而在C++中,各个重载函数在符号表中命名方式是不同的,且有一套命名规则

函数符号 = _Z + 函数名长度 + 函数名 + 参数列表类型的缩写

可以看到跟函数的返回值的类型没有关系,因此验证了之前的观点。
在这里插入图片描述
在这里插入图片描述
当然上面的例子是属于全局函数的范畴,重载函数的命名规则很复杂,但是不必去细究,只需知道大概的原理即可。

总结

函数重载在某些场景下便利了许多,但是并不是可以重载的函数都要重载。
在这里插入图片描述这是摘自C++ primer书上的一段建议。

关于重载还有很多可以深究的细节,等以后学习到了再来补充。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值