01 成員物件與封閉類
類里有其他物件則該物件叫成員物件;有成員物件的類叫 封閉類;
class CTyre // 輪胎類
{
public:
// 有引數建構式
// 初始化成員變數m_radius和m_width
CTyre(int r, int w):m_radius(r),m_width(w) { }
private:
int m_radius; // 半徑
int m_width; // 寬度
};
class CEngine // 引擎類
{
// 默認會有無引數建構式
};
class CCar // 汽車類 -- 封閉類
{
public:
// 有引數建構式
// 對成員變數m_price初始化,對成員物件tyre初始化
CCar(int p, int tr, int tw):m_price(p),tyre(tr,tw){}
private:
int m_price; // 價格
CTyre tyre; // 成員物件
CEngine engine; // 成員物件
};
int main()
{
CCar car(10000,20,50);
return 0;
}
上例中,如果CCar類不定義建構式,則會使用默認的無參建構式,那么下面的陳述句會編譯出錯:
CCar car;
因為編譯器不明白CCar類中的tyre成員物件該如何初始化,engine成員物件的初始化則沒問題呢,因為用默認建構式即可,
任何生成封閉類物件的陳述句,都要讓編譯器明白,物件中的成員物件,是如何初始化的,
具體的做法是:通過封閉類的建構式的初始化串列,
02 封閉類建構式和解構式的執行順序
- 封閉類物件生成時,先執行所有成員物件的建構式,然后才執行封閉類的建構式,
- 成員物件的建構式執行順序,與在封閉類定義成員物件的順序一致,
- 當封閉類的物件消忙時,只需要記住一句話:先構造的物件,后析構,由于封閉類是最后才被構造的,所以封閉類物件最先析構,
class CTyre // 輪胎類
{
public:
CTyre(){ std::cout << "CTyre 建構式" << std::endl; }
~CTyre(){ std::cout << "CTyre 解構式" << std::endl; }
};
class CEngine // 引擎類
{
public:
CEngine(){ std::cout << "CEngine 建構式" << std::endl; }
~CEngine(){ std::cout << "CEngine 解構式" << std::endl; }
};
class CCar // 汽車類 -- 3. 最后構造封閉類物件
{
public:
CCar(){ std::cout << "CCar 建構式" << std::endl; }
~CCar(){ std::cout << "CCar 解構式" << std::endl; }
private:
CTyre tyre; // 1. 先構構造該成員物件
CEngine engine; // 2. 接著構造該成員物件
};
int main()
{
CCar car;
return 0;
}
執行結果:
CTyre 建構式
CEngine 建構式
CCar 建構式
CCar 解構式
CEngine 解構式
CTyre 解構式
03 封閉類的復制建構式
class A
{
public:
// 無引數建構式
A() { std::cout << "A 建構式" << std::endl; }
// 復制建構式
A(A & a) { std::cout << "A 復制建構式" << std::endl; }
};
class B
{
// 若沒有宣告建構式和復制建構式,則編譯器會默認生成建構式和復制建構式
A a; // 成員物件
};
int main()
{
B b1; // b1物件 和 成員物件a都會執行無引數的建構式
B b2(b1); // b2物件 和 成員物件a都會執行復制建構式
return 0;
}
輸出結果:
A 建構式
A 復制建構式
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/84921.html
標籤:C++
上一篇:C++ this指標的理解和作用
下一篇:C++ static靜態成員

