深度理解重载函数

重载函数


重载函数

为什么c++里面函数可以重载呢 ? 为什么c里面就不可以呢 ?

我们先来创建一个.cpp程序。

请添加图片描述

这里只需要.后面是cpp就可以了,前面是自己起的名字。

我们可以来简单的写一写重载函数。

请添加图片描述

这里就可以看出,重载函数的类型是不同的。

请添加图片描述

这里下面的报错说Add重定义,说明这两个函数没有构成重载,仔细观察一下这两个函数,它们的形参类型好像是相同的,形参的个数也是相同的啊。不同的一点就是返回值的类型是不相同的。这说明了函数重载和返回值有关系吗 ? 没关系。

请添加图片描述

这个时候我在第二个函数里面加了个形参,现在这两个函数的区别就是第一个函数有两个形参,第二个函数有三个参数,这个时候程序运行起来了,而且没有报错,说明这两个函数构成了函数重载。进一步说明了函数重载和它的形参个数也有关系。个数不同也是能构成函数重载的。

请添加图片描述

这个时候又来了两个函数,看一下这两个函数的区别,第一个函数两个形参,第二个函数也是两个形参,唯一的区别就是两个形参的类型不一样,而且第一个函数的int 类型的形参在第一个位置,而第二个函数的形参在第二个位置,这个时候程序也是能跑起来的,说明这两个函数也可以函数重载,说明形参的类型以及位置对函数重载也是有关系的。

以上就是重载函数的几种情况。

接下来就说一说为什么c++可以进行重载函数,而c不可以进行重载函数。

请添加图片描述

可以看到在c里面写重载函数就会直接报错。

请添加图片描述

请添加图片描述

上述第一个图是c的,下面的图是c++的,可以看一下箭头指向的地方,c和c++的是不一样的。c语言中就只有_Add,而c++里面有挺长一串东西(箭头指向的地方)。这里是因为Windows的一些配置,所以比较难理解,我们可以切换到Linux环境下面来看一下。

请添加图片描述

这是在Linux上面写的一段代码。我们接下来转一下汇编。

请添加图片描述

这个是c语言下转化成汇编的样子。

请添加图片描述

这个是c++下转成汇编的样子。

我们可以看出这两个东西不是一模一样的代码,为什么在gcc和g++下面跑起来怎么看着有点不太一样啊,我们可以这样理解,c++对函数的名字进行了一些修饰,让它变得有点与众不同了,就拿上面的例子来说,c就直接是函数名,没什么好说的。而c++是<_Z4funcid> 这些东西都是什么呢 ?

_Z可以理解为是一种前缀。
4是func函数名的长度。
id 是 int double 两个函数形参的类型(注意类型的位置也是很重要的哦)

对比上面的例子是不是就可以很好的理解为什么c++可以重载函数,c不可以重载函数了。

再来看一个例子

请添加图片描述

请添加图片描述

这是c的转成汇编的样子。

请添加图片描述

这是c++的转成汇编的样子。

强调一下上面的 <_z5func1Pid> 这里面的 Pid 分成 Pi 和 d
Pi 是 int* 类型的
d 是double类型的

这里我们就可以更近一步的理解重载函数。我们可以理解为c++对函数名字进行了一些修饰。而c就是单纯的函数名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值