當乙個類中嵌入的有另乙個類時,如果沒有對內嵌物件初始化,則先對內嵌的預設預設構造(有的話也是先對內嵌的不過是呼叫非預設構造),再執行外層類的構造,析構時先析構外層類,再析構內層類。
我們來看一下下面這段**的建構函式和析構函式的順序:
#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中遇到函式中有區域性物件時,...