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

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

我們先定義一個房地產類

class HomeForSale{}

我們認為一個房地產應該是獨一無二的,所以不希望他被拷貝或者賦值。所以我們希望下面的語句是錯誤的,編譯器應該不予通過

int main() {
    HomeForSale h1;
    HomeForSale h2;
    HomeForSale h3(h1);	// wrong
    h1 = h2	// wrong
}

那如何實現呢?

上述的兩個語句分別呼叫了HomeForSale類的拷貝建構函式和賦值運算子過載函式。通常來講,如果我們不實現一個函式,那麼編譯器在呼叫的時候自然會報錯。但是這兩個函式非常特殊,如果我們自己不定義,編譯器自己會給我們定義。那現在的問題就是怎麼阻止編譯器自己定義。

編譯器自己定義方法都是public的,所有人都能用。如果我們自己宣告一個私有的,那麼外面的人呼叫時候就會出錯。這可以算一個解決方案。但是它不絕對安全。因為HomeForSale這個類自己也可能會進行賦值和拷貝。

為了解決這個問題,我們可以考慮設計一個UNcopyable基類。

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

我們將不可複製這一個功能下放到基類。這樣即使我們的派生類想要賦值,基類也不會允許。

  • 將相應的成員函式宣告為私有並不予實現
  • 利用一個基類實現私有功能,並讓不允許拷貝的類作為派生類