C++ 成員對象和封閉類

  • 2020 年 3 月 31 日
  • 筆記

成員對象與封閉類

類里有其他對象則該對象叫 「成員對象」,有成員對象的類叫「封閉類」。

上例中,如果 CCar 類不定義構造函數,則會使用默認的無參構造函數,那麼下面的語句會編譯出錯:

CCar car;

因為編譯器不明白 CCar 類中的 tyre 成員對象該如何初始化。而 engine 成員對象的初始化則沒問題,因為用 CEngine 類的默認構造函數即可。

任何生成封閉類對象的語句,都要讓編譯器明白,對象中的成員對象,是如何初始化的。

具體的做法是:

通過封閉類的構造函數的初始化列表。

構造和析構順序

封閉類對象生成時,先執行所有成員對象的構造函數,然後才執行封閉類的構造函數。

成員對象的構造函數執行順序,與在封閉類定義成員對象的順序一致。

當封閉類的對象消亡時,只需要記住一句話:先構造的對象,後析構。

所以由於封閉類是最後才被構造的,所以封閉類對象最先析構。

通過下面的程式碼的例子,就更能明白封閉類和成員函數的構造和析構的順序了:

執行結果:

CTyre 構造函數  CEngine 構造函數  CCar 構造函數  CCar 析構函數  CEngine 析構函數  CTyre 析構函數

封閉類的複製構造函數

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

輸出結果:

A 構造函數  A 複製構造函數