其實這一節的內容是和item5緊密相連的,上一節的核心圍繞著編譯器會自動生成類的一些方法,那麼這一節就是圍繞著如何去避免這些自動生成的方法。
前一節說到如果想要編譯器避免自動生成,解決方法就是自己來寫乙個,而且要保證寫的這個「用不了」,所以辦法就是宣告為private修飾的。
但是這樣做其實是不夠安全的,原因就是成員函式是可以呼叫private的方法,再就是友元函式也可以呼叫。除非你足夠聰明保證不去定義這些。
解決辦法就是把這些函式宣告成private,並且故意不去實現它們。書上說到這種做法很常見,在標準庫中i/o為了避免拷貝行為都是這樣做的。這時如果是在成員函式或者友元中呼叫了這些方法,雖然編譯是沒有問題,但是會在鏈結階段發生錯誤,因為這個private函式啥都沒做。
class uncopyable
~uncopyable() {}
private:
uncopyable(const uncopyable&); // ...but prevent copying
uncopyable& operator=(const uncopyable&);
};
這個類是由於建構函式和析構函式是protected,所以它的派生類是可以呼叫。但是拷貝建構函式和拷貝賦值運算子都是private
接著把需要控制的類繼承到這個uncopyable類
class homeforsale: private uncopyable ;
此時,如果有任何情況(包括成員函式和友元函式)嘗試去拷貝這個homeforsale物件的話,編譯器會嘗試生成homeforsale的拷貝建構函式和拷貝賦值運算子,但是因為派生類進行拷貝的時候會把基類的內容也要拷貝(item12會講到),所以會呼叫uncopyable的拷貝建構函式或者拷貝賦值運算子,但是由於是private,所以會被編譯器發現錯誤。
書上還說到這個uncopyable類的設計很精妙,提到了很多點都是在書的後面內容講到,在後面學習到再進行補充。
總結一下這一節的點:
為了避免編譯器自動生成的某些函式,通常有兩種方法:
Effective c 學習筆記(六)
阻止拷貝的關鍵是 由於所有編譯器產出的函式都是public,可以將拷貝建構函式和拷貝運算子宣告為private。明確宣告乙個成員函式,可以阻止編譯器自動建立其專屬版本,而令這些函式為private,可以阻止使用者呼叫它。class home 當使用者拷貝home物件,編譯器會報錯。為阻止拷貝動作而設...
Effective C 讀後筆記六
條款26 盡可能延後變數定義式的出現時間 除非在變數要使用的那一刻,否則不要提前定義變數。對於迴圈來說,當你不在迴圈外使用變數時,盡量在迴圈內定義變數。條款39 明智而審慎地使用private繼承 private繼承並不意味is a關係,即不是真正意義上的繼承,而是implemented in te...
Effective C 學習筆記
學習effective c 已經有相當長的一段時間了,今天抽出時間又堵了一遍第一部分 c語言 c 以c語言為基礎,幾乎支援所有的c語言成分,例如區塊 語句 預處理 內建資料型別 陣列 指標等,c語言的侷限是 沒有模板 沒有異常 沒有過載 物件導向的c 也就是加上了物件特性的c,類 封裝 繼承 多型 ...