拷贝构造函数和赋值运算符及怎样返回一个类的对象

 

最近工作中偶然的机会,要写一个封装函数,实现的功能是返回一个类(封装了xml的操作)的对象,遇到的问题是返回后的对象一直是被销毁的状态。

为了方便全部是截图,个人有点懒了~

下面是主程序

主要代码就中间那三行, 主要来练习赋值运算符和拷贝构造函数的用法。下面为方便调试在类中加一个标记a,其中Read是一个static的方法,a是static的成员变量,下面主要实现代码

 

下面,从 主程序中的那三行代码第一行开始分析:

从Read函数内部return开始,到返回及xml1接收到返回进行单步跟踪:

以下返回时先将用局部变量构造出临时变量,以下是临时变量的拷贝构造函数,其中临时变量标记a=100:

x的内存,其中x是Read函数中局部变量xml的引用:

Return之后,首先局部变量xml开始销毁,以下是其析构函数:

下面进入外层赋值操作,调用的是拷贝构造函数,赋值运算的所有者xml(是最外层的xml哦)标记a=99:

其中x正是临时变量的引用:

下面这个初看就有些奇怪了(我刚开始是这样想的啊~),但这个变量xml1的初始化过程,调用了拷贝构造函数,xml1的标记a=100:

其中x是xml的引用:

到此,第一句分析完了,好家伙这么多东西,又是拷贝构造函数、又是赋值,最后还有一个拷贝构造函数。小结一下大致过程如下:   局部变量-->(拷贝构造函数)-->临时变量-->赋值运算符-->xml变量-->拷贝构造函数-->xml1

 而第二句和第一句右半部分是等价,不再详述,有兴趣的读者可以自行单步跟踪。

下面分析第三句

Read内局部变量构造临时变量,调用拷贝构造函数:

x为局部变量xml的引用:

Return返回后局部变量xml销毁:

 临时变量销毁

 

最后xml_ref是通过拷贝构造函数创建的,所以其标记a=100

(拷贝构造函数的断点我忘了截图了,抱歉啊大家~)

到这里就基本明天了所有流程,如果一个新对象去接Read的返回值,则直接调用拷贝构造函数;如是一个已经存在的变量去接Read的返回值,则直接调用赋值运行符处理。

PS:

如果没有重载赋值 运算符,用第二句去调用,那么结果xml变量得到的是销毁后的Read的临时变量, 笔者刚开始就是犯了这个错,有兴趣的记者可以实验一下。

 

结束分割线---------------------------------------------------------------------------------------------------------------------------

以上个人实际项目中的经验总结,比较适合初学者(汗~),大神请不吝赐教或一笑而过



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一马途追

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

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

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

打赏作者

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

抵扣说明:

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

余额充值