1. 程式人生 > >《effective c++》讀書筆記(上)

《effective c++》讀書筆記(上)

作用 成員 了解 static 左值 section 構造 單純 fec

最近在讀《Effective C++》,確實是經典之作,但是有的條款也需要一些細節補充,所以都列在這篇文章裏,希望能不斷更新,個人閱讀的是第三版,不包括C++ 11的內容。

條款1:視C++為一個語言聯邦。

主要可分為4個次語言(sublanguage),C的部分,OOP的部分,template部分以及標準庫STL。都有各自不同的習慣,用哪塊就用哪塊的規範。

目前比較熟悉的是c的那部分和oop的那部分,tSTL, emplete的那部分正在學習,確實感覺到了風格和規範有所不同,所以之後可能需要分開進行對比。

條款2:盡量以const, enum, inline替換#define。

這點也沒什麽好說的,#define只是做單純的文本展開,其中如果有++x這樣的指令會有嚴重的副作用,所以盡量用其他三者作為其原有功能的替 代,另外c99也認可了#inline,不過還是要明確const定義的常量和#define定義的常量的區別,前者編譯時是一個symbol,後者就是 一個字面值。

條款3:盡可能使用const。

條款4:確定對象被使用前已被初始化。

註意構造函數的初始化列表和賦值的區別,不同編譯單元之間的non-local static變量的定義順序是未定義的,所以最好用local static對象來替代類似的訪問呢。

條款5:了解C++默默編寫並調用哪些函數。

合成的構造函數,copy構造函數,析構函數和copy assignment函數。

條款6:若不想使用編譯器自動生成的函數,就該明確拒絕。

將相應的合成的成員函數聲明為private並且不定義,另外繼承一個把copy assignment函數和copy構造函數聲明為私有的類可以讓編譯器在用戶欲拷貝派生類時報錯。因為基類的copying函數不允許繼承類調用,而調 用基類的copying函數是合成的派生類copying函數的默認行為。

條款7:為多態基類聲明virtual析構函數。

含有virtual成員函數的基類應該也將析構函數聲明為virtual的。

條款8:別讓異常逃離析構函數。

條款9:絕不在構造和析構過程中調用virtual函數。

因為在構造和析構函數中,base class構造期間virtual函數絕對不會下降到derived classes階層。在derived class對象的base class構造期間,對象的類型是base class而不是derived class。一旦derived class析構函數開始執行,對象內的derived class成員便呈現未定義值,所以C++視它們仿佛不再存在,進入base class析構函數後對象就成為一個base class對象。

條款10:令operator=返回一個reference to *this。

因為這樣方便了鏈式賦值的處理(a = b = c = d,優先級相同,結合性從右往左,所以 a = (b = (c = d)),標準庫),而operator=是單目操作符重載,其左值隱式參數為*this,即自身,所以return *this收尾,哦這個標準是習慣,非強制,只是覺得還是保持同一個習慣比較好。

《effective c++》讀書筆記(上)