C++基礎知識面試必備、複習細節 (5) {Effective c++}

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參數無關的代碼抽離到模板外

原因是模板會根據具體類型具象化不同的代碼,如果將與模板無關的代碼也放入模板函數或者類中,那麼就會生成重複的代碼,就會導致代碼膨脹的問題,函數模板中與參數無關的代碼可以包裝成單獨的函數。類模板中與參數無關的模板可以放到父類中。

不要輕易忽視編譯器的警告

嚴肅對待編譯器的警告,也不要過度依賴於編譯器的報警能力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章