1. 程式人生 > >effective c++ 條款06:若不想使用編譯器自動生成的函數,就該明確拒絕

effective c++ 條款06:若不想使用編譯器自動生成的函數,就該明確拒絕

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:若不想使用編譯器自動生成的函數,就該明確拒絕