effective c 04 設計與宣告

2021-10-13 16:00:08 字數 1567 閱讀 5582

東陽的學習記錄

介面設計要清晰無歧義,能讓使用者知曉每乙個引數的含義以及使用目的、方法

「促進正確使用」 的方法包括介面的一致性,以及與內建型別的行為相容

「阻止誤用」 的方法有:

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 當然...