Effective C++ 條款06 若不想使用編譯器自動生成的函式就明確拒絕
阿新 • • 發佈:2021-02-05
技術標籤:Effective c++
如果不宣告copy ctor和copy assignment,編譯器會自動宣告,並且都是public的。如何阻止copying呢?
1. 將成員函式宣告為private而且故意不去實現它
c++標準庫的iostream程式中就是這樣做的。ios_base, basic_ios和sentry類無一例外。我查看了安裝Dev c++時候安裝的編譯器gnu c++的原始碼,如下:
這樣,如果拷貝該類物件,編譯器會阻止;如果不慎在member函式或friend函式呼叫,連結器會抱怨。
另外,我們知道,把連線期錯誤移到編譯器很好(愈早查出錯誤肯定愈好),第1種方式改進之。
2. 專門設計一個base類
這個基類不含任何資料,具體實現:
class Uncopyable {
protected:
Uncopyable() {}
~Uncopyable() {} // 允許derived class構造和析構
private:
Uncopyable(const Uncopyable&);
Uncopyable& operator=(const Uncopyable&);
};
// 為了阻止example類物件被拷貝,只需繼承Uncopyable類
class example : private Uncopyable {
. .. // 該類不再宣告copy ctor和copy assignment
};
任何嘗試拷貝example類物件的行為,compiler都會自動生成一個copy ctor和copy assign. 而這些編譯器生成版會嘗試呼叫base class的對應兄弟,而base class中的拷貝函式是private的,所以編譯出錯。
3. Boost庫提供的noncopyable類
其實就是第2點。
總結:為了駁回compiler自動提供的機能,可將相應的成員函式宣告為private並且不予實現。使用想Uncopyable這樣的base class也是一種做法。