对象作为函数参数

对象作为函数的参数时,其传递过程较为复杂,传递方式比较独特。其传参过程与数组不同:数组变量的名称代表数组的首地址,而对象的变量名称却不能代表对象的首地址。传参时不会像数组那样以首地址作为函数的参数传递,而是先将对象中的所有数据进行备份(复制),将复制的数据作为形参传递到调用函数中去、

这里就详细讲讲还有堆空间的对象浅拷贝就行,其它的可以评论区讨论讨论

类对象中的数据成员的传参顺序为:最先定义的数据成员最后压栈,最后定义的数据成员最先压栈

但是当对象里面 申请堆空间的时候,使用 传参且浅拷贝,它只把堆空间地址传过去,拷贝到形参中去

在这里插入图片描述

在这里插入图片描述

我们从地址40122C可以看出mov eax ,dword [ebp-10h],这句话的意思是把参数的值,也就是堆空间的地址作为参数直接传给形参对象,然后开辟的堆空间却是同一块地方。
注意和lea ecx , [ebp-10h]不一样,这里的ecx指的是对象的地址,并非堆空间的地址,堆空间的地址是 对象的值,这条指令执行的是把对象的地址(即this指针)作为形参传给构造函数,然后构造函数进行一系列的初始化。

这里举个例子给大家理解理解什么对象的地址,什么是堆的地址(即m_pSpring一个指针)。
假如:依据题意数据 为以下数据
(MyString的首地址)对象的地址:0x1234(此地址值存在占空间作为参数传递)
对象的值(也就是m_pSpring的地址):0x5566 (即 [ebp-10h])
(m_pSpring的地址)堆指针的地址:0x5566
(m_pSpring的值) 堆指针的值:0x4567(这里指向了所new出来的堆空间)

在这里插入图片描述

这里有一句m_pSpring地址并非main函数中的对象MyString的首地址
解释一下 m_pSpring地址也就是MyString的值,[ebp+8]也就是上面地址40122F所传进来的eax(调用函数push进来的第一个参数),[ebp+4]这里是上个函数的返回地址,地址4010E4这里lea ecx [ebp+8]取的是堆指针的地址,把堆指针的地址作为参数传给getString函数,然后进行操作。

在这里插入图片描述
这里两次释放堆空间,第一次释放是调用完ShowString函数后进行了堆的释放(也就是**(地址4010F2或者401235)代码**结束后),第二次释放是main函数(地址4010FF或者401242)代码结束后

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寻梦&之璐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值