東陽的學習記錄介面設計要清晰無歧義,能讓使用者知曉每乙個引數的含義以及使用目的、方法
「促進正確使用」 的方法包括介面的一致性,以及與內建型別的行為相容
「阻止誤用」 的方法有:
i 建立新型別、限制型別上的操作
ii 束縛物件值
iii 消除客戶的資源管理責任
shared_ptr 支援定製型刪除器。這可防範ddl問題,可被用來自動解除互斥鎖等等
新 type 如何建立和銷毀?
物件的初始化和複製有何區別?
新 type 物件如果被 pass-by-value, 意味著什麼?
什麼是 type 的合法值?
你的新 type 需要配合某個繼承圖系嗎?
你的新 type 需要什麼樣的型別轉換?
什麼樣的操作符和函式對於新 type 是合理的?
什麼樣的標準函式應該被駁回?(那正是你必須宣告為 private 者)
誰該取用新 type 的成員?
新 type 有多麼一般化?、
你真的需要乙個新 type 嗎?
以 const & 傳遞可以迴避構造析構成本。
以const & 傳遞引數可以防止物件被切割。若以值傳遞,將會使得派生類中屬於派生類獨有的那一部分被閹割
對於內建型別,stl的迭代器和函式物件使用值傳遞更加高效
不要返回區域性棧物件的引用,否則會造成空懸指標
返回堆物件的引用也是乙個壞主意
記住:通過函式統一控制,能夠實施精準的訪問控制永遠不要返回區域性物件的引用或指標, 永遠不要返回堆物件的引用, 永遠不要返回指標或引用指向乙個 local static 物件而有可能同事需要多個這樣的物件。
方便以後更改**以及維護
可用計算替代儲存值,視實際情況選擇
就封裝性來說,protected與public一樣
封裝性與「當其內容改變時可能造成的**破壞量成反比」
使用非成員函式,能降低編譯依存度,帶來更大的封裝性
我們使用封裝的原因,使我們的改變影響更少的人
非成員函式提供更大的封裝性,因為其不可訪問 private 成員
將不同功能置於多個標頭檔案中
任何時候,能避免使用 friend 函式就應該避免
如果你需要對所有的引數(包括 this 所指的隱喻引數)進行型別轉換,那麼這個函式必須是非成員函式。
如果你希望你的軟體有預期的效果,不要往std命名空間新增任何東西
記住:當std::swap對你的型別效率不高時,提供乙個swap成員函式並確保這個函式不拋異常
如果你提供了乙個成員的swap,就應該提供乙個 non-member swap 用來呼叫前者,對於class(而不是模板),請特化 std::swap
呼叫第二步中的swap時,使用using std::swap將 std空間中的swap新增到作用域中
為 「使用者定義型別「 進行 std templates 全特化是好的,但是千萬不要在 std 中加入任何全新的東西
讀書筆記Effective C 04 個人向
1.盡可能延後變數定義式的出現時間,一旦出現變數的宣告最好當場初始化 注意與賦值的區別 比如 string password 123456 通過copy建構函式可以避免無意義的default構造行為。經常出現的乙個情況是,變數如果需要在迴圈中使用,那麼是應該定義在迴圈外然後每次複製,還是每次都在迴圈...
《Effective C 》條款04總結
條款04 確定物件使用前已被初始化 class test test obj 其中,obj的成員變數 x,y 有時候被初始化,有時候不被初始化。讀取未初始化的值會導致一些不明確的行為,有時候可能會導致你的程式終止執行。處理方法 永遠在使用物件之前先將它初始化。1 對於內建型別,採用手工方式進行完成,如...
Effective C 筆記 設計與宣告 三
item 23 用非成員非友元函式取代成員函式 想象乙個象徵 web urls 的歷史,以及從系統移除所有 cookies 的功能 class webbrowser 很多使用者希望能一起執行全部這些動作,所以 webbrowser 可能也會提供乙個函式去這樣做 class webbrowser 當然...