通常如果你不希望class支援某一特定機能,只要不宣告對應函式就是了。但這個策略對copy建構函式和copy assignment操作符卻不起作用。如果你自己沒有宣告,編譯器就會為你的class宣告(編譯器版本的)乙個copy建構函式、乙個copy assignment操作符和乙個析構函式。(此外如果你沒有宣告任何建構函式,編譯器也會為你宣告乙個default建構函式。所有這些函式都是public且inline.)於是你的class被強迫支援copying,然而這裡的目標卻是要阻止copying。
答案的關鍵是,所有編譯器產生的函式都是public。為阻止copy函式被建立出來,你可以將copy建構函式或copy assignment操作符宣告為private。藉由明確宣告乙個成員函式,你阻止了編譯器暗自建立其專屬版本;而令這些函式為private,使你得以成功阻止人們呼叫它。一般而言這個做法並不絕對安全,因為member函式和friend函式還是可以呼叫你的private函式。
除非你只宣告,卻不定義它們,那麼如果任何不慎呼叫都會獲得乙個鏈結錯誤(linkage error)。如此一來,當客戶企圖拷貝你的class物件,編譯器會阻撓他。如果你不慎在member函式或friend函式之內那麼做,輪到聯結器發出抱怨。
有沒有可能將鏈結錯誤移至編譯期?(畢竟愈早偵測出錯誤愈好)。答案是可行的。
方法就是專門設計乙個阻止copying的base class,並將其copy建構函式和copy assignment操作符宣告為private。
class uncopyable
~uncopyable(){}
private:
uncopyable(const uncopyable& other);
uncopyable& operator=(const uncopyable& other);
};
為求阻止class物件被拷貝,我們唯一需要做的就是繼承uncopyable:
class derived : public uncopyable
};
這樣,任何人--甚至是member函式或friend函式--嘗試拷貝derived物件,編譯器便試著生成乙個copy建構函式和乙個copy assignment操作符。這些函式的「編譯器生成版」會嘗試呼叫其base class的對應兄弟,那些呼叫會被編譯器拒絕,因為其base class的拷貝函式是private。
注:千萬不要畫蛇添足在derived class中再次private宣告copy建構函式和copy assignment操作符,否則會阻擋編譯器生成版的嘗試。切記!
引自《effective c++》
copy 複製物件
作用 提供一些函式,可以使用淺副本或深副本語義複製物件 1.淺副本 copy 建立的淺副本 shallow copy 是乙個形容器,其中填充原物件內容的引用,建立list物件的乙個淺副本時,會構造乙個新的list.並將原物件的元素追加到這個list。1.深副本 deepcopy 建立的深副本是乙個新...
阻止文章被別人複製黏貼
直接在body 裡加上這一段 nm useup document.selection.empty 禁用鍵盤中的ctrl alt shift複製黏貼 document.onkeydown function if event.altkey if event.shiftkey 禁用滑鼠事件 documen...
關於物件的copy方法
使用copy方法賦值,均為淺拷貝,不重新開闢記憶體位址,只是將物件指向同一記憶體位址 使用mutablecopy方法賦值,均為深拷貝,會從新開闢一塊記憶體位址 nsarray arr1 123213 nsarray arr2 arr1.copy nsarray arr3 arr1.mutableco...