Effective C++ 條款06:若不想使用編譯器自動生成的函式,就該明確拒絕
阿新 • • 發佈:2021-06-24
我們先定義一個房地產類
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&); }
我們將不可複製這一個功能下放到基類。這樣即使我們的派生類想要賦值,基類也不會允許。
- 將相應的成員函式宣告為私有並不予實現
- 利用一個基類實現私有功能,並讓不允許拷貝的類作為派生類