C 搞清楚類中構造與析構的順序

2022-07-28 14:18:21 字數 1220 閱讀 9173

定義乙個類物件時,首先根據初始化列表初始化類的成員(就算沒有顯式定義初始化列表,編譯器也會預設地初始化一次),然後執行建構函式。因此,類成員的建構函式必定先於類的建構函式執行。

class

a ~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...