effective c++ 條款06:若不想使用編譯器自動生成的函數,就該明確拒絕
阿新 • • 發佈:2018-06-10
ble 這樣的 ive c++ 拒絕 類對象 析構 並且 防止
記住:
為防止編譯器暗自提供的功能,可將相應的成員函數聲明為privae並且不予實現。也可以使用Uncopyable這樣的父類實現。
對於獨一無二的對象,希望不支持拷貝構造函數和賦值操作符。
class HomeForSale { public: ... private: HomeForSale(const HomeForSale&); //只是聲明,阻止編譯器自動生成 HomeForSale& operator=(const HomeForSale&); } HomeForSale h1; HomeForSale h2; HomeForSale h3(h1);// 編譯失敗 h1 = h2; // 編譯失敗
另一種方法
class Uncopyable { protected: //允許子類對象構造和析構 Uncopyable() {} ~Uncopyable() {} private: Uncopyable(const Uncopyable&); //阻止拷貝 Uncopyable& operator=(const Uncopyable&); } class HomeForSale: private Uncopyable { } HomeForSale h1; HomeForSale h2; HomeForSale h3(h1);// 編譯失敗 h1 = h2; // 編譯失敗
基類中 繼承方式 子類中
public & public繼承 => public
public & protected繼承 => protected
public & private繼承 = > private
protected & public繼承 => protected
protected & protected繼承 => protected
protected & private繼承 = > private
private & public繼承 => 子類無權訪問
private & protected繼承 => 子類無權訪問
private & private繼承 = > 子類無權訪問
effective c++ 條款06:若不想使用編譯器自動生成的函數,就該明確拒絕