C++ 成員對象和封閉類
- 2020 年 3 月 31 日
- 筆記
成員對象與封閉類
類里有其他對象則該對象叫 「成員對象」,有成員對象的類叫「封閉類」。

上例中,如果 CCar 類不定義構造函數,則會使用默認的無參構造函數,那麼下面的語句會編譯出錯:
CCar car;
因為編譯器不明白 CCar 類中的 tyre 成員對象該如何初始化。而 engine 成員對象的初始化則沒問題,因為用 CEngine 類的默認構造函數即可。
任何生成封閉類對象的語句,都要讓編譯器明白,對象中的成員對象,是如何初始化的。
具體的做法是:
通過封閉類的構造函數的初始化列表。
構造和析構順序
封閉類對象生成時,先執行所有成員對象的構造函數,然後才執行封閉類的構造函數。
成員對象的構造函數執行順序,與在封閉類定義成員對象的順序一致。
當封閉類的對象消亡時,只需要記住一句話:先構造的對象,後析構。
所以由於封閉類是最後才被構造的,所以封閉類對象最先析構。
通過下面的程式碼的例子,就更能明白封閉類和成員函數的構造和析構的順序了:

執行結果:
CTyre 構造函數 CEngine 構造函數 CCar 構造函數 CCar 析構函數 CEngine 析構函數 CTyre 析構函數
封閉類的複製構造函數
當封閉類執行複製構造函數時,成員對象也會執行對應的複製構造函數,參考下面的程式碼例子:

輸出結果:
A 構造函數 A 複製構造函數