今天看了下Qt编程,顺便查了下C++的构造与析构,看到网上有一篇测试的文章,自己在linux也试了下,不过结果还是和在windows下有些区别的,具体原因我也没有深入研究。
具体代码如下:
执行结果如下:
Demo default ctor. method., objName = Default object.
Enter testMethod1.
Demo(int ival) ctor method,i = 1, objName = d in testMethod1
Exit testMethod1.
Demo dector. method, i = 1, objName = d in testMethod1
Enter testMethod0.
Demo(int ival) ctor method,i = 0, objName = d in testMethod0
Exit testMethod0.
Demo dector. method, i = 0, objName = d in testMethod0
Demo(int ival) ctor method,i = 999, objName = d1
Enter testMethod2.
Demo(int ival) ctor method,i = 2, objName = d in testMethod2
Exit testMethod2.
d.i = 1
d1.i = -1
d2.i = 999
d3.i = 2
Demo dector. method, i = 2, objName = d in testMethod2
Demo dector. method, i = 999, objName = d1
Demo dector. method, i = 1, objName = d in testMethod1
在进行对象声明的时候也调用了一个默认构造函数,在调用方法0和方法1时,内部创建的对象都是临时的,在退出相对应的函数的时候对象就析构了,d和d1应该是指向被析构的对象,不过奇怪的是,它们最好输出的值居然是正确的,在网上那篇文章中,说在d = testMethod1(); 发生了拷贝操作,但我们这里没有出现,不过在编译这个文件的时候倒是说“warning: reference to local variable ‘d’ returned”,好像是说引用了局部变量d,难道说类的声明也仅仅是一个引用,只有在 testMethod2(); 使用了指针对指向了新的对象,这个对象没有被自动析构,不过使用指针引用对象的话需要自己对对象进行删除。
看输出结果发现明明发生了5次析构,刚好也是发生了5次构造,但是没有发现默认构造的对象被析构,d in testMedthod1倒是析构了两次,怪异,总感觉又一次是析构默认创建的对象,不过又找不到依据。
使用 Demo d = testMethod1();的方式倒是可以防止默认析构。
看来以后使用c++还是有些问题需要注意。