1. 程式人生 > >Effective C++ 筆記(2)構造/析構/賦值運算

Effective C++ 筆記(2)構造/析構/賦值運算

賦值構造 只讀 初始 pre cti copy 類構造 div vat

05、了解C++默默編寫並調用哪些函數

  (1)、默認構造函數

Empty(){...} //調用父類構造函數,non-static成員變量構造函數,不會默認初始化內置類型

  (2)、析構函數

~Empty(){...} //調用父類析構函數,non-static成員變量析構函數

  (3)、拷貝構造函數

Empty(const Empty& rhs){...} //單純地將來源對象的每一個non-static變量拷貝到目標對象

  (4)、賦值構造函數

Empty& operator=(const Empty& rhs){...} //單純地將來源對象的每一個non-static變量拷貝到目標對象

  類內有引用、const、及父類的拷貝構造函數,賦值構造函數為private時,編譯器會拒絕生成這一類函數。換言之,如果類內有引用、const成員變量,或者其父類的相關函數不可訪問時,必須手動生成。

class Empty:
{
public:
    Empty(){...}
    Empty(const Empty& rhs){...}
    ~Empty(){...}
    
    Empty& operator=(const Empty& rhs){...}
private:
    const int m_cInt; //只讀成員變量
    int &ref; //引用型成員變量,必須在每個構造函數手動初始化
};

  

06、若不想使用編譯器自動生成的函數,就該明確拒絕

禁止被拷貝構造或賦值構造的做法:

  (1)、將相應成員函數聲明為private且不去實現它。(鏈接期出錯

class HomeForSale
{
public:
    HomeForSale();
    ~HomeForSale();
private:
    HomeForSale(const HomeForSale& rhs);    //只有聲明
    HomeForSale& operator=(const HomeForSale& rhs);    
};

  (2)、private繼承Uncopyable類(編譯期出錯

)

class Uncopyable
{
public:
    Uncopyable(){};
    ~Uncopyable(){};
private:
    Uncopyable(const Uncopyable& rhs);
    Uncopyable& operator=(const Uncopyable& rhs);
};

  

Effective C++ 筆記(2)構造/析構/賦值運算