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

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

技術標籤:Effective c++

如果不宣告copy ctor和copy assignment,編譯器會自動宣告,並且都是public的。如何阻止copying呢?

1. 將成員函式宣告為private而且故意不去實現它
c++標準庫的iostream程式中就是這樣做的。ios_base, basic_ios和sentry類無一例外。我查看了安裝Dev c++時候安裝的編譯器gnu c++的原始碼,如下:
ios_base.h的原始碼
這樣,如果拷貝該類物件,編譯器會阻止;如果不慎在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也是一種做法。