最近工作中偶然的机会,要写一个封装函数,实现的功能是返回一个类(封装了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的临时变量, 笔者刚开始就是犯了这个错,有兴趣的记者可以实验一下。
结束分割线---------------------------------------------------------------------------------------------------------------------------
以上个人实际项目中的经验总结,比较适合初学者(汗~),大神请不吝赐教或一笑而过