Effective C++讀書筆記之六:若不想使用編譯器自動生成的函數,就該明確拒絕

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
 {
 	...
 }

//雲風評註:Uncopyable非常重要。實踐中,大多數對象都是Uncopyable的。當一個對象無需考慮怎樣複製時可以迴避許多問題。
std::vector 實現的前提是置於其中的對象可以被複制。大多數情況下,我們應該在其中存放對象的引用,而不是值。//

請記住:

爲駁回編譯器自動提供的機能,可將相應的成員函數聲明爲private並且不予實現。使用像 Uncopyable這樣的base class也是一種做法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章