今天看了下Qt程式設計,順便查了下C++的構造與析構,看到網上有一篇測試的文章,自己在linux也試了下,不過結果還是和在windows下有些差別的,具體原因我也沒有深入研究。
具體代碼如下:
#include "stdio.h"
class Demo{
public :
int i;
const char* objName;
Demo(){
objName = "Default object.";
printf("%s, objName = %s/r/n", "Demo default ctor. method.", objName);
i = 1000;
}
Demo(int ival, const char* name){
printf("%s,i = %d, objName = %s/r/n", "Demo(int ival) ctor method", ival, name);
i = ival;
objName = name;
}
Demo(const Demo& d){
printf("%s/r/n", "Demo copy ctor method.");
i = d.i;
objName = "copied d";
}
~Demo(){ //xigou
printf("%s, i = %d, objName = %s/r/n", "Demo dector. method" , i, objName);
i = -1;
objName = "Error";
}
};
Demo& testMethod0(){
printf("%s/r/n", "Enter testMethod0.");
Demo d(0, "d in testMethod0");
printf("%s/r/n", "Exit testMethod0.");
return d;
}
Demo testMethod1(){
printf("%s/r/n", "Enter testMethod1.");
Demo d(1, "d in testMethod1");
printf("%s/r/n", "Exit testMethod1.");
return d;
}
Demo* testMethod2(){
printf("%s/r/n", "Enter testMethod2.");
Demo *d = new Demo(2, "d in testMethod2");
printf("%s/r/n", "Exit testMethod2.");
return d;
}
int main(int argc, char* argv[])
{
Demo d; //聲明函數居然會發生構造
d = testMethod1(); //2
Demo& d1 = testMethod0(); //3
Demo d2(999, "d1"); //4
Demo* d3 = testMethod2(); //5
printf("d.i = %d/r/n", d.i);
printf("d1.i = %d/r/n", d1.i);
printf("d2.i = %d/r/n", d2.i);
printf("d3.i = %d/r/n", d3->i);
delete d3;
return 0;
}
執行結果如下:
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++還是有些問題需要注意。