C 學習筆記8 成員物件與封閉類

2021-10-02 12:06:50 字數 1716 閱讀 4280

1 定義:有成員物件的類叫封閉類。

2 例子:(見本工程closeclass.cpp)

//

// 封閉類例子

//#include

using

namespace std;

class

ctyre

// 輪胎類};

class

cengine

;class

ccar

;// 使用了初始化列表

ccar::

ccar

(int p,

int tr,

int tw)

:price

(p),

tyre

(tr, tw)

intmain()

在該例子中,如果ccar類不定義建構函式,則下面的語句會編譯出錯:ccar car;

因為編譯器不明白car.typleie該如何初始化,car.engine的初始化沒問題,用預設建構函式就可以。

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

具體做法:通過封閉類的建構函式的初始化列表。

4 成員物件初始化列表中的引數可以是任意複雜的表示式,可以包括函式,變數,只要表示式中的函式或變數有定義就可以。

5 封閉類建構函式和析構函式的執行順序

(1)封閉類物件生成時候,先執行所有物件成員的建構函式,然後才執行封閉類的建構函式

(2)物件成員的構造函式呼叫次序和物件成員在類中的說明次序一致, 與他們在成員初始化列表**現的次序無關。

(3)當封閉類的物件消亡時,先執行封閉類的析構函式,然後再執行成員物件的析構函式。次序和建構函式的呼叫次序相反。

6 封閉類呼叫例子(見本工程closeclass2.cpp)

//

// 演示封閉類成員函式和析構函式呼叫次序

//#include

using

namespace std;

class

ctyre

~ctyre()

};class

cengine

~cengine()

};class

ccar

~ccar()

};int main (

)

7 封閉類的複製建構函式(見本工程closeclasscopy.cpp)

/**

* 封閉類的複製建構函式演示

* * 輸出結果:

* default

* copy

* * 解釋:說明b2.a是用類a的複製建構函式初始化的。而且呼叫複製建構函式時的實參就是b1.a

* 無參建構函式初始化b1的時候,b1.a如何初始化? 由於沒有交代,所有使用class a的無參建構函式初始化,所以輸出default

* 生成b2的時候使用class b的預設複製建構函式進行初始化b2,那麼b2.a如何初始化呢? 用class a的複製建構函式去初始化b2.a, 吧b1.a複製到b2.a,而且呼叫複製建構函式的時候,實參就是b1.a

* */

#include

using

namespace std;

classaa

(a& a)};

classb;

intmain()

C 成員物件和封閉類

有其他類的物件作為 成員物件的類叫封閉類。任何生成封閉類物件的語句,都要讓編譯器明白,物件中的成員物件,是如何初始化的。具體做法是通過封閉類的建構函式的初始化列表。封閉類物件生成時,先執行所有物件成員的建構函式,然後才執行封閉類的建構函式。物件成員的構造函式呼叫次序和物件成員在類中的說明次序一致,與...

三 類與物件提高 成員物件和封閉類

乙個類的成員是其他類的物件,就把這樣的成員成為成員物件 有成員物件的類叫 封閉 enclosing 類 class ctyre 輪胎類 後初始化列表,可以對成員進行初始化 class cengine 引擎類 class ccar 汽車類 封閉類 ccar ccar int p,int tr,int ...

c 初始化成員列表 C 成員物件和封閉類

成員物件與封閉類 類裡有其他物件則該物件叫 成員物件 有成員物件的類叫 封閉類 上例中,如果 ccar 類不定義建構函式,則會使用預設的無參建構函式,那麼下面的語句會編譯出錯 ccar car 因為編譯器不明白 ccar 類中的 tyre 成員物件該如何初始化。而 engine 成員物件的初始化則沒...