天天看點

C++構造與析構

今天看了下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++還是有些問題需要注意。

繼續閱讀