通常如果你不希望class支援某一特定機能,只要不宣告對應函式就是了。但這個策略對copy建構函式和copy assignment操作符卻不起作用,你如果不宣告它們,而某些人嘗試呼叫它,編譯器會為你宣告它們。
這把你逼到了乙個困境。如果你不宣告copy建構函式和copy assignment操作符,編譯器可能為你產出乙份,於是你的clas支援copying。如果你宣告它們,你的class還是支援copying。但這裡的目的卻是要阻止copying。
答案的關鍵是,編譯器所產出的函式都是public。你可以將copy建構函式或copy assignment操作符宣告為private。藉由明確宣告乙個成員函式,你阻止了編譯器暗自建立其專屬版本;而令這些函式為private,使你得以成功阻止人們呼叫它。
這個做法並不絕對安全,因為member函式和friend函式還是可以呼叫你的private函式。你可以「將成員函式宣告為private而且故意不實現它們」,這樣,如果你試圖通過member函式和friend函式呼叫它,鏈結器會發出抱怨。
將鏈結期的錯誤移至編譯期是可能的,只要將copy建構函式和copy assignment操作符宣告為private就可以辦到,但不是在derived class類自身,而是在乙個專門為了阻止copying動作而設計的base class 內:
class uncopyable
4: ~uncopyable(){}
5:private:
6: uncopyable( const uncopyable& ) ;
7: uncopyable& operator=( const uncopyable& );
8: };
9:
10:class derived:private uncopyable;
這行得通,因為只要任何人——甚至是member函式或friend函式——嘗試拷貝derived 物件,編譯器便試著生成乙個copy建構函式和乙個copy assignment操作符,這些函式的「編譯器生成版」會嘗試呼叫其base class的對應兄弟,那些呼叫會被編譯器拒絕,因為其base class的拷貝函式為private。
請記住:
為駁回編譯器自動提供的機能,可將對應的成員函式宣告為private並且不予實現。使用象uncopyable這樣的base class也是一種做法。
Effective C 筆記 條款11
為什麼會出現自我賦值呢?不明顯的自我賦值,是 別名 帶來的結果 所謂 別名 就是 有乙個以上的方法指涉物件 一般而言如果某段 操作pointers或references而它們被用來 指向多個相同型別的物件 就需要考慮這些物件是否為同乙個。實際上兩個物件來自同乙個繼承體系,它們甚至不需要宣告為相同型別...
Effective C 筆記 條款09
為方便採用書上的例子,先提出問題,在說解決方案。class transaction 7 8 transaction transaction base class 的建構函式之實現9 13 14 class buytransaction public transaction 假設在程式中 buytra...
Effective C 筆記 條款08
c 並不禁止析構函式吐出異常,但它不鼓勵你這樣做。考慮如下 class widget 假設這個可能吐出乙個異常5 6 7 void dosomething 8 當vector v被銷毀,它有責任銷毀其內含的所有widgets。銷毀第乙個丟擲異常,銷毀第二個丟擲異常 異常對c 而言太多了。其實,在兩個...