定義乙個類物件時,首先根據初始化列表初始化類的成員(就算沒有顯式定義初始化列表,編譯器也會預設地初始化一次),然後執行建構函式。因此,類成員的建構函式必定先於類的建構函式執行。
classa ~a()
};class
b ~b()
};class
d ~d()
};class
x
virtual ~x()
virtual
void
test()
d d;
};class c:public
x ~c()
virtual
void
test()
private
: a a;
b b;
};int
main()
new c的時候,由於c由x繼承而來,因此先構造x。首先,按照初始化列表初始化x的成員變數,這裡沒有初始化列表,系統也會預設地為d進行預設初始化,此時呼叫d的建構函式,列印in d。(先初始化成員,再執行建構函式)
x的初始化階段結束後,執行x的建構函式,列印in x。
x部分構造結束後,開始構造c的部分。同樣的先進行初始化工作,無論有無初始化列表,無論初始化列表的順序如何,成員的初始化順序都按宣告順序進行初始化。列印in a,in b。
c的成員完成初始化後,呼叫c的建構函式,列印in c。
/*----------------------------------至此,new c的過程完畢-----------------------------------------*/
基類指標呼叫虛函式,進行動態繫結,輸出test in c
/*----------------------------------開始對指標p析構-----------------------------------------*/
析構的順序就是構造順序的逆序。就是先析構父類,再析構子類。先析構本類,再析構本類的成員。
於是列印的順序為o c, o b, o a, o x, o d
這個例子同時也解釋了,為什麼基類的析構函式要宣告為虛函式。如果
//不是虛函式
~x()
那麼delete p時候會直接析構p的靜態型別x,所以c的成員以及c的析構函式將不會執行,這樣就會造成記憶體洩露。
C 類構造與析構順序
1.虛基類建構函式被呼叫,以繼承順序從左到右 如果存在虛基類 2.上一層非虛基類建構函式被呼叫,以繼承順序從左到右而非成員初值列上寫的順序 顯示呼叫或缺省構造 如果存在非虛基類 3.虛表指標指向適當虛表 如果類存在虛表指標 4.類資料成員初始化,以宣告的順序而非成員初值列上寫的順序。5.執行使用者所...
c 組合類的構造,複製構造,析構順序
先貼 include using namespace std class cat public cat int intialage catage intialage cout 餘童蘭上課習題,被點名回答,沒答案上來 有兩個類 cat和 dog zoo乙個組合類,包含cat和dog 各有 構造,複製構...
類 構造與析構執行順序詳解
1.示例說明 以下面的程式說明函式的執行順序 1 定義string類,構造和析構會列印其中的字串 2 定義乙個基類base,類中含有兩個string 3 從基類base派生出derive類,類中含有乙個string 每個類函式成員都會將執行函式名列印出來。struct string string c...