有其他類的物件作為 成員物件的類叫封閉類。
任何生成封閉類物件的語句,都要讓編譯器明白,物件中的成員物件,是如何初始化的。
具體做法是通過封閉類的建構函式的初始化列表。
封閉類物件生成時,先執行所有物件成員的建構函式,然後才執行封閉類的建構函式。
物件成員的構造函式呼叫次序和物件成員在類中的說明次序一致,與它們在成員初始化列表中的出現次序無關。
當封閉類物件消亡時,先執行封閉類的析構函式,然後再執行成員物件的析構函式。次序和建構函式的呼叫順序相反。其原因是如果封閉類帶的析構函式中使用到了成員物件的內容,那麼先執行成員物件的析構函式,就可能會導致封閉類的析構函式在執行時發生不可預估的錯誤。
封閉類建構函式例項。
class
ctyre
// init list};
class
cengine
;class
ccar
;ccar::
ccar
(int p,
int tr,
int tw)
:price
(p),
tyre
(tr, tw)
intmain()
如果 ccar 類不定義建構函式,則 ccar car; 將出現編譯錯誤
編譯器不知道 car.tyre 該如何初始化
car.engine 初始化沒有問題,用預設建構函式
生成封閉類物件的語句 -> 明確「物件中的成員物件」-> 如何初始化
定義封閉類的建構函式時,新增初始化列表:
類名::建構函式(參數列)
:成員變數1
(參數列)
, 成員變數2
(參數列),.
..
呼叫順序
當封閉類物件生成時,
首先:執行所有成員物件的建構函式
最後:執行封閉類的建構函式
成員物件的構造函式呼叫順序
1.和成員物件在類中的說明順序一致
2.與在成員初始化列表**現的順序無關
當封閉類的物件消亡時,
首先:先執行封閉類的析構函式
最後:執行成員物件的析構函式
成員物件和封閉類
成員物件 乙個類的成員變數是另乙個類的物件 包含成員物件的類叫封閉類 enclosing class ctyre 初試化列表 class cengine class ccar ccar ccar int p,int tr,int w price p tyre tr,w int main 如果ccar...
成員物件和封閉類
成員物件和封閉類 乙個類的成員變數如果是另乙個類,就稱之為成員物件。包含成員物件的類叫做封閉類。當封閉類的物件產生並初始化時,它包含的成員物件也需要被初始化,這時就會引發對成員物件 建構函式的呼叫。如何讓編譯器知道到底是使用哪個建構函式初始化的呢?這可以通過在定義封 閉類的建構函式時,新增初始化列表...
c 初始化成員列表 C 成員物件和封閉類
成員物件與封閉類 類裡有其他物件則該物件叫 成員物件 有成員物件的類叫 封閉類 上例中,如果 ccar 類不定義建構函式,則會使用預設的無參建構函式,那麼下面的語句會編譯出錯 ccar car 因為編譯器不明白 ccar 類中的 tyre 成員物件該如何初始化。而 engine 成員物件的初始化則沒...