C++基礎知識面試必備、複習細節 (5) {Effective c++}
儘可能延後變量定義式的時間
儘可能推遲定義變量,只有在真正要使用的時候再定義,最好在需要初始化時定義,即定義時就立刻初始化。
儘量少做轉型動作
儘量避免使用cast,必須使用cast的情況下,應儘量將cast置於函數內部
避免返回一個指針、引用或者迭代器指向類內的成員
原因是如果返回了成員的引用或者指針,就可以通過這個引用或者指針修改類內的private成員
努力處理異常
當異常被拋出時,要做到不泄露任何資源,不允許數據敗壞。
inline函數
儘量將inline用在小型、被頻繁調用的函數身上,便於之後調試,同時提升程序速度的同時減小代碼膨脹問題
inline只是一種申請,編譯器會根據具體情況來決定一個函數是否可以是inline得,比如遞歸函數、virtual函數、代碼較多的函數,即使你聲明瞭inline關鍵字,編譯器也不會將此類函數視爲inline的函
將文件間的編譯依存關係降至最低
儘量讓頭文件不依賴其他文件,以對聲明的依賴取代對定義的依賴
確保public繼承表示的是"is a"關係
也就是說,派生類是一個基類,基類上的每一個事情都使用於派生類
名稱遮掩問題
子類會遮掩父類同名的函數,可以使用類名作用域決定調用父類還是子類的函數。
區分接口繼承和實現繼承
在public繼承下,派生類總是會繼承基類的接口。
對於純虛函數只繼承接口,子類必須重載該函數;對於非純虛函數繼承接口並存在默認的實現繼承,普通函數則繼承接口及並強制繼承其實現。
考慮virtual函數以外的其他選擇
不要重新定義繼承而來的非虛函數
non-virtual在實現上是靜態綁定的,調用父類還是子類的函數完全取決於指針或者對象的類型。在子類重定義non-virtual時,父類的相同的函數是不會被覆蓋的
不要重新定義繼承而來的默認參數
通過複合composition塑造出has-a或"根據某物實現出"
在應用域,複合意味着has-a,在實現域,符合以爲着 根據某物實現出
明確私有繼承
由private base class繼承而來的所有成員,在derived class中都會變成private屬性
慎重使用多重繼承
瞭解typename
聲明template參數時,前綴關鍵字class和typename可以互換
學習處理模板化基類內的名稱
在子類模板中,如果要引用父類模板的name時,用this->name、using Base<T>::name聲明或者基類限定(Base<T>::name)的方式。
將與template參數無關的代碼抽離到模板外
原因是模板會根據具體類型具象化不同的代碼,如果將與模板無關的代碼也放入模板函數或者類中,那麼就會生成重複的代碼,就會導致代碼膨脹的問題,函數模板中與參數無關的代碼可以包裝成單獨的函數。類模板中與參數無關的模板可以放到父類中。
不要輕易忽視編譯器的警告
嚴肅對待編譯器的警告,也不要過度依賴於編譯器的報警能力。