Effective C++ 筆記(2)構造/析構/賦值運算
阿新 • • 發佈:2018-06-21
賦值構造 只讀 初始 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)構造/析構/賦值運算