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 成員物件的初始化則沒...