條款5:瞭解C++默默編寫而且調用了哪些函數安全
一、 構造函數,析構函數,拷貝賦值函數,拷貝構造函數。函數
class Empty { public: //默認構造函數 Empty(){}; //拷貝構造函數 Empty(const Empty& rhs){} //析構函數 ~Empty(){} //拷貝賦值函數 Empty& operator=(const Empty& rhs){}; }; //默認構造函數 Empty e1; //拷貝構造函數 Empty e2(e1); //拷貝賦值函數 Empty e3=e1;
二、 類中包含引用的時候沒法進行通常的賦值操做,必須本身定義拷貝賦值操做符this
條款6:若不想使用編譯器自動生成的函數就應該明確拒絕spa
一、 聲明爲private能夠阻止(單不絕對安全,member函數和friend函數還能夠調用)code
class Empty { public: //默認構造函數 Empty(){}; //析構函數 ~Empty(){} private: //拷貝構造函數 Empty(const Empty& rhs){} //拷貝賦值函數 Empty& operator=(const Empty& rhs){}; };
二、 聲明一個uncopyable的基類,再繼承它對象
class Empty:private Uncopyable { public: //默認構造函數 Empty(){}; //析構函數 ~Empty(){} }; class Uncopyable { public: //默認構造函數 Uncopyable(){}; //析構函數 ~Uncopyable(){} private: //拷貝構造函數 Uncopyable(const Uncopyable& ){} //拷貝賦值函數 Uncopyable& operator=(const Uncopyable& ){}; };
條款7:爲多態基類聲明virtual析構函數blog
一、 基類的析構函數要加virtual,防止delete的時候局部銷燬繼承
二、 不是基類別就不須要編譯器
條款8:別讓異常跳出析構函數編譯
一、 析構函數在處理的時候必定要加上try catch
二、 若是須要對異常進行反應,則把處理寫成一個普通的方法處理,加上標誌位,運行正常後再在析構函數中處理
條款9:毫不在構造函數和析構函數中調用virual函數
條款10:令operator= 返回一個reference to *this
一、 class& operator=(){return *this}
條款11:在operator=中處理自我輔值
一、肯定在一個函數中包含2個對象的時候,這兩個對象是同一個對象的狀況下是否正確
條款12複製對象時勿忘記其每個成分
一、