effective c++學習筆記

--------------------1讓本身習慣c++-----------------------------------------c++

Rule 1 : c++看作一個語言聯邦,共有4個次語言:c(區塊、語句、預處理器、內置數據類型、數組、指針);面向對象c++(類、封裝、繼承、多態、虛函數);模板c++STL(容器、迭代器、算法以及函數對象)。當你從某個次語言切換到另外一個,致使高效編程守則要求你改變策略時,不要感到驚訝。算法

 

Rule 2:儘可能以constenuminline替換#define,儘可能以編譯器代替預處理器。express

 

Rule 3 儘量使用constconst最具微力的應用是面對函數聲明時的應用:函數返回值,各參數,成員函數自身。編程

 

Rule 4:肯定對象被使用前已先被初始化。須要關注三方面的問題:1.對內置類型意外的任何其餘東西,確保每個構造函數都將對象每個成員初始化。2.構造函數的初值列列出的成員變量,其排列次序應該和他們在class中的聲明次序相同。3.定義於不一樣編譯單元的non-local static對象的初始化次序是不肯定的。解決方法:將每一個non-local static對象搬到本身的專屬函數內(該對象在此函數內被聲明爲static數組

-------------------2構造/析構/賦值運算  ----------------------------------------安全

Rule 5:瞭解c++默默編寫並調用了這些函數(都是publicinline):默認構造函數,默認析構函數,複製構造函數,複製賦值操做符函數。ide

 

Rule 6:若不想使用編譯器自動生成的函數,就該明確拒絕。例如若不想類被複制或者賦值,就該明確拒絕,這有兩個方法。函數

 

Rule 7:爲多態基類聲明virtual析構函數。學習

 

Rule 8:讓異常逃離析構函數。析構函數絕對不要吐出異常,這會致使程序可能過早結束或出現不明確的行爲。若是一個被析構函數調用的函數可能拋出異常,析構函數應該捕捉任何異常,而後吞下它們(不傳播)或結束程序。this

 

Rule 9:毫不在構造和析構過程當中調用虛函數,這類調用從不降低至派生類。解決辦法是令派生類將必要的構造信息向上傳遞至base class構造函數。令函數爲static,也就不可能意外指向初期未成熟之對象內還沒有初始化的成員變量

 

Rule 10:令operator = 返回一個referenceto *this

 

Rule 11:在operator = 中處理自我賦值

 

Rule 12:複製對象時勿忘其每個成分。

---------------------3資源管理---------------------------------------------------------

Rule 13:以對象管理資源。令資源在構造期間得到,在析構期間釋放。

 

Rule 14:在資源管理類中當心copying行爲。當一個RAII對象被複制,會有如下2種處理方式:1.禁止複製,2.對底層資源祭出引用計數法」:一般只要內含一個tr1:shared_ptr成員變量,RAIIclasses即可實現出引用計數的複製行爲。

 

Rule 15:在資源管理類中提供對原始資源的訪問。

 

Rule 16:成對使用newdelete時要採用相同的形式。

 

Rule 17:以獨立語句將newed對象置入智能指針,不然可能致使資源泄露,應該將如下語句:

processWidget(std::tr1::shared_prt<Widget>(newWidget),priority());

替換爲(獨立語句)

std::tr1::shared_ptr<Widget>pw(new Widget);

processWidget(pw,priority());

----------------------------4設計與聲明-------------------------------------------------------

Rule 18:讓接口容易被正確使用,不易被誤會。

 

Rule 19:設計class猶如設計type。應該和語言設計者當初設計語言內置類型時同樣謹慎地來研討class的設計。

 

Rule 20:儘可能以pass-by-reference-to-const替換pass-by-value,但對內置類型,pass-by-value每每比較適當。

 

Rule 21:必須返回對象時,別妄想返回其reference

 

Rule 22:將成員變量聲明爲private

 

Rule 23:寧以non-membernon-friend替換member函數。

 

Rule 24:若是須要爲某個函數的全部參數(包括被this指針所指的那個隱喻參數)進行類型轉換,那個這個函數必須是個non-member

 

Rule 25:考慮寫出一個不拋出異常的swap函數。

----------------------------------------5實現------------------------------------------------------

Rule 26:儘量延後變量定義式的出現時間,這樣能夠避免構造(和析構)非必要對象。

 

Rule 27:儘可能少作轉型動做。C++的集中轉型類型:

const_cast<T>(expression)  //惟一可將對象的常量性移除。

dynamic_cast<T>(expression)  //安全向下轉型

reinterpret_case<T>(expression)  //執行低級轉型

static_cast<T>(expression)  //強迫隱式轉換,例如non-const對象轉爲const對象,或將int轉爲double等等。

 

Rule 28:避免返回handles指向對象內部成分,這樣會破壞封裝性和const性。

應該將

Point& upperLeft() const {returnpData->ulhc;}

替換爲

const Point& upperLeft() const {returnpData->ulhc;}

 

Rule 29:爲異常安全而努力使值得的。

 

Rule 30:透徹瞭解inlining。一開始不要將任何函數聲明爲inline,或至少將inlining施行範圍侷限在那些必定成爲inline」十分平淡無奇的函數身上。

 

Rule 31:將文件間的編譯依存關係降至最低,將接口與實現分離。通常構想是相依於聲明式,不要相依於定義式。基於此構想的2個手段是handle classesinterface classes

 

--------------------------6繼承與面向對象設計---------------------------------

Rule 32:肯定你的public繼續塑模出is-a關係。

類之間的三種關係:is-ahas-ais-implemented-in-terms-of(根據某物實現出)

 

Rule 33:避免遮掩繼承而來的名稱。

若是你繼承base class並加上重載函數,而你又但願從新定義或覆寫其中一部分,那麼你必須爲那些本來會被遮掩的每一個名稱引入一個using聲明式,不然某些你但願繼承的名稱會被遮掩。

當你不想繼承base class的全部函數,可使用private繼承和轉交函數(什麼是轉交函數?調用基類函數的函數)。

 

Rule 34:區分接口繼承和實現繼承。

 

Rule 35:考慮virtual函數之外的其餘選擇。

藉由non-vitualinterface手法實現template method模式:虛函數應該幾乎老是private,令客戶經過public non-virtual成員函數間接調用private virtual函數。

藉由函數指針實現策略模式。

 

Rule 36:毫不從新定義繼承而來的non-virtual函數。

 

Rule 37:毫不從新定義繼承而來的缺省(默認)的參數值。

 

Rule 38:經過複合塑模出has-a根據某物實現出

 

Rule 39:明智而審慎地使用private繼承。若是class Dprivate形式繼承class B,則用意是爲了採用classB內已經備妥的某些特性。

 

Rule 40:明智而審慎地使用多重繼承。

 

 

-----------------------7模板與泛型編程-------------------------------------------------------------------

Rule 41:瞭解隱式接口和編譯期多態。

classestemplates都支持接口和多態。

classes而言,接口是顯式的,以函數簽名爲中心,多態則經過virtual函數發生於運行期。

template參數而言,接口是隱式的,奠定於有效表達式(如if語句內的表達式),多態則是經過template具現化和函數重載解析發生於編譯期。

 

Rule 42:瞭解typename的雙重意義。

 

Rule 43:學習怎麼得到基類模板中的名稱。

 

Rule 44:將與參數無關的代碼抽離templates

 

Rule 45:運用成員函數模板接受全部兼容類型。

 

Rule 46:須要類型轉換時請爲模板定義非成員函數。

 

Rule 47:請使用traitsclasses表現類型信息。

 

Rule 48:認識templates元編程。

------------------------8定製newdelete------------------------------------------------------------------------

Rule 49:瞭解new-handler的行爲。

 

Rule 50:瞭解newdelete的合理替換時機。

 

Rule 51:編寫newdelete時需固守常規。

 

Rule 52:寫了placementnew也要寫placement delete

 

------------------------------------9雜項討論----------------------------------------------------------------------------

Rule 53:不要輕忽編譯器的警告。

 

Rule 54:讓本身熟悉包括tr1在內的標準程序庫。

 

Rule 55:讓本身熟悉boost

相關文章
相關標籤/搜索