1 讓自己習慣C++
條款01 :視C++爲一個語言聯邦
C,Object-Oritented C++,Template C++,STL
條款02:儘量以const,enum,inline替換 #define
條款03:儘可能使用const
許多人漠視一個事實:兩個成員函數如果只是常量性不同,可以被重載
條款04:確定對象被使用前已先被初始化
這個規則很容易奉行,重要的是別混淆了賦值和初始化。
2 構造/析構/賦值運算
條款05:瞭解C++默默編寫並調用哪些函數
條款06:若不想使用編譯器自動生成的函數,就該明確拒絕
將成員函數聲明爲private而且故意不實現它們
條款07:爲多態基類聲明virtual析構函數
條款08:別讓異常逃離析構函數
條款09:絕不在構造和析構過程中調用virtual函數
條款10:令operator=返回一個reference to *this
爲了實現連鎖賦值
條款11:在operator=中處理“自我賦值”
條款12:複製對象時勿忘其每一個成分
3 資源管理
所謂資源就是,一旦用了它,將來必須歸還給系統。如果不這樣,糟糕的事情就會發生。
條款13:以對象管理資源
條款14:在資源管理類中小心copying行爲
條款15:在資源管理類中提供對原始資源的訪問
條款16:成對使用new和delete時要採取相同形式
條款17:以獨立語句將newed對象置入智能指針
以獨立語句將newed對象存儲於(置入)智能指針內。如果不這樣做,一旦異常被拋出,有可能導致難以察覺的資源泄漏。
4設計與聲明
所謂軟件設計,是“令軟件做出你希望它做的事情”的步驟和做法,通常以頗爲一般性的構想開始,最終演變成十足的細節,以允許特殊接口的開發。
條款18:讓接口容易被正確使用,不易被誤用
條款19:設計class猶如設計type
條款20:寧以pass-by-reference-to-const替換pass-by-value
條款21:必須返回對象時,別妄想返回其reference
條款22:將成員變量聲明爲private
條款23:寧以non-member、non-friend替換member函數
條款24:若所有參數皆需類型轉換,請爲此採用non-member函數
條款25:考慮寫出一個不拋出異常的swap函數
swap是個有趣的函數,原本它只是STL的一部分,而後成爲異常安全性編程的脊柱,以及用來處理自我賦值可能性的一個常見機制。
5實現
條款26:儘可能延後變量定義式的出現時間
條款27:儘量少做轉型動作
const_cast dynamic_cast static_cast reinterpret_cast
條款28:避免返回handles指向對象內部成分
條款29:爲“異常安全”而努力是值得的
不泄漏任何資源
不允許數據敗壞
基本承諾
強烈保證
不拋擲保證
條款30:透徹瞭解inlining的裏裏外外
條款31:將文件間的編譯依存關係降至最低
6繼承與面向對象設計
條款32:確定你的public繼承塑出is-a關係
條款33:避免遮掩繼承而來的名稱
條款34:區分接口繼承和實現繼承
條款35:考慮virtual函數以外的其他選擇
條款36:絕不重新定義繼承而來的non-virtual函數
條款37:絕不重新定義繼承而來的缺省參數值
條款38:通過複合塑模出has-a或“根據某物實現出”
條款39:明智而審慎地使用private繼承
條款40:明智而審慎地使用多重繼承
7模板與泛型編程
條款41:瞭解隱式接口和編譯期多態
條款42:瞭解typename的雙重意義
條款43:學習處理模板化基類內的名稱
條款44:將與參數無關的代碼抽離templates
條款45:運用成員函數模板接受所有兼容類型
條款46:需要類型轉換時請爲模板定義非成員函數
條款47:請使用traits classes表現類型信息
條款48:認識template元編程
8定製new和delete
條款49:瞭解new-handler的行爲
條款50:瞭解new和delete的合理替換時機
條款51:編寫new和delete時需固守常規
條款52:寫了placement new也要寫placement delete
9雜項討論
條款53:不要輕忽編譯器的警告
條款54:讓自己熟悉包括TR1在內的標準程序庫
條款55:讓自己熟悉Boost