C 析構函式和建構函式執行的順序時機

2021-10-10 02:29:58 字數 1487 閱讀 8968

當乙個類中嵌入的有另乙個類時,如果沒有對內嵌物件初始化,則先對內嵌的預設預設構造(有的話也是先對內嵌的不過是呼叫非預設構造),再執行外層類的構造,析構時先析構外層類,再析構內層類。

我們來看一下下面這段**的建構函式和析構函式的順序:

#include

#include

using

namespace std;

string getmystring()

class

zheng

;zheng

(zheng& z)

zheng

(zheng && z)

zheng

(const

int&& x):a

(x)~

zheng()

void

set(

int b)};

struct test

test

( zheng&& s)

~test()

};zheng getmyvalue()

intmain

(int argc,

char

const

*ar**)

// string a = "1234";

;// zheng s;

// zheng *p = &s; //這邊只會呼叫一次建構函式,說明引用並不會呼叫建構函式

// zheng &x1 = s;

}return0;

}

列印結果:

第乙個是在執行getmyvale()函式中執行zheng x1;呼叫的建構函式;

第二個是在將getmyvale()返回的物件賦值給test s時呼叫的test類建構函式,因為test類中有內嵌的物件,所以要先給內嵌的物件進行預設構造;

第三個是內嵌的物件構造完畢就開始構造自己的,因為rerun返回的是臨時值也即右值,所以呼叫的是右值引用建構函式;

第四個是函式getmyvale()中的物件x1呼叫的析構函式,這裡有人會有疑問了為什麼不是return完就呼叫析構函式,而是要test的物件都構造完了才開始析構呢?

這個很好理解,因為我要將return的物件傳給了test物件才能析構(也就是讓test的物件都構造完了才能釋放記憶體),不然還沒傳就析構刪除了,test接收了個寂寞,要等引數接收完了才刪除!

這裡其實還有個細節,如果是之前的版本的話,在return之前x1是要析構的

但是這裡會在多乙個建構函式要return時要在建乙個零時物件來傳遞x1;但是c++最新的特性有個rvo,返回值優化,就把這個建立零時物件給優化了,減少了使用記憶體空間,從而也就需要完成零時物件的任務,在傳完引數後再析構。

第五個就是呼叫了test的析構函式,這裡就是因為棧的記憶體空間是先存後去,這種格式,後構造的外層test物件要先析構刪除,在析構內層的zheng物件。

C 建構函式 析構函式順序

1 輸入以下程式,分析執行結果。2 修改上面的4個類,新增析構函式,在析構函式中輸出各私有資料成員的值。並分析結果。實驗分析以及心得體會 主要是類的多繼承性,在繼承了多個基類之後,派生類物件呼叫的建構函式和析構函式的順序,以及在派生關係中同名函式的隱藏關係,根據實驗結果可以發現派生類物件在呼叫建構函...

C 中建構函式 虛函式 析構函式的執行順序

include using namespace std class a virtual void func 第七步 執行類a的析構函式,輸出 析構函式a a virtual void fund class b public a 第四步 執行主函式裡的c.fun 輸出 開始.並呼叫func 由於fun...

C 中建構函式與析構函式的執行順序

今天在測試乙個建構函式和析構函式的用例的時候,發現我們所鍾愛的vc6.0實在是bug問題越來越多,對於學習c 的新手來講,有必要在這裡給大家說明一下。建構函式順序為 全域性物件的建構函式 main函式中物件的建構函式,包括automatic static依次呼叫 main中遇到函式中有區域性物件時,...