C++ 成員對象和封閉類

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 復制構造函數
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 有其他類的對象作為 成員對象的類叫封閉類。 任何生成封閉類對象的語句,都要讓編譯器明白,對象中的成員對象,是如何初...
    d16ug_a1l閱讀 1,123評論 0 1
  • 3. 類設計者工具 3.1 拷貝控制 五種函數拷貝構造函數拷貝賦值運算符移動構造函數移動賦值運算符析構函數拷貝和移...
    王偵閱讀 1,861評論 0 1
  • 一個博客,這個博客記錄了他讀這本書的筆記,總結得不錯。《深度探索C++對象模型》筆記匯總 1. C++對象模型與內...
    Mr希靈閱讀 5,616評論 0 13
  • C++文件 例:從文件income. in中讀入收入直到文件結束,并將收入和稅金輸出到文件tax. out。 檢查...
    SeanC52111閱讀 2,840評論 0 3
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,533評論 1 51