Item 06:Explicitly disallow the use of compiler-generated functions you do not want
假設在某些情況下,你不希望class支持某一特定機能,這隻要不聲明對應的函數就是了。但這個策略對cpoy構造函數和copy assignment操作符卻不起作用,因爲如果你不聲明它們,而某些人嘗試調用它們,這時編譯器會爲你聲明它們。
將copy構造函數和copy assignment操作符聲明爲private是一個好的辦法。藉由明確聲明一個成員函數,你阻止了編譯器暗自創建其專屬版本;而令這些函數爲private,使你得以成功阻止人們調用它。如下:
class HomeForSale
{
public:
...
private:
...
HomeForSale(const HomeForSale&);
HomeForSale& operator=(const HomeForSale&);//只有聲明
};
由於這個函數畢竟不會被實現出來,因此參數名稱並不一定要寫出來。
還有另外一種方法,可以將連接期的錯誤轉移至編譯器,只要設計一個專門爲了阻止copying動作的base class即可:
class Uncopyable
{
protected: //允許derived對象構造和析構
Uncopyable(){}
~Uncopyable() {}
private:
Uncopyable(const Uncopyable&);//但阻止copying
Uncopyable& operator=(const Uncopyable&);
};
class HomeForSale:private Uncopyable
{
...
}
std::vector 實現的前提是置於其中的對象可以被複制。大多數情況下,我們應該在其中存放對象的引用,而不是值。//
請記住:
爲駁回編譯器自動提供的機能,可將相應的成員函數聲明爲private並且不予實現。使用像 Uncopyable這樣的base class也是一種做法