# Preface(前言)
作者:[Scott Meyers](http://aristeia.com/)
譯者:[fatalerror99 (iTePub's Nirvana)](mailto:fatalerror9999@hotmail.com?subject=Preface)
發布:[http://blog.csdn.net/fatalerror99/](http://blog.csdn.net/fatalerror99/)
我在 1991 年寫出了 _Effective C++_ 的最早版本,1997 年出了第二版,我更新了一些重要的方面的素材,但是,因為我不想使熟悉本書第一版的讀者感到困惑,我盡最大可能保持了原有的結構。最早的 50 個 Item 標題中的 48 個原則上保持不變。如果把書看作一棟房子,第二版就相當于通過更換地毯、涂料和燈光設備等使其煥然一新。
對于第三版,我打散了原有的秩序。(很多次我希望我能做得更徹底。)1991 年以來,C++ 世界經歷了巨大的改變,而將近 15 年以前我制定的那些 Item 也不再契合本書的目標——將最重要的 C++ 編程準則融入小而易讀的建議中。1991 年,假設 C++ 程序員具有 C 語言背景是有一定道理的。現在,轉到 C++ 的程序員很可能來自 Java 或 C#。1991 年,inheritance(繼承)和 object-oriented programming(面向對象編程)對于大多數程序員來說都是新鮮的。現在,這些已經是非常普遍的概念,而 exceptions(異常),templates(模板),以及 generic programming(泛型編程)成為新的需要更多指導的領域。1991 年,沒有人聽說過 design patterns(設計模式)。現在,討論軟件系統時很難不涉及它們。1991 年,C++ 正式標準化的工作剛剛開始。現在,標準化已經八年了,而下一個版本的工作也已經開始。
為應對這些變化,我盡己所能將寫字板擦得一干二凈,并不斷地追問自己:“在 2005 年,對于目前的 C++ 程序員,什么才是最重要的建議?”結果就是這個新版本中的一組 Item。本書包括了關于 resource management(資源管理)和 programming with templates(使用模板編程)的新的章節。實際上,templates(模板)的考慮貫穿全書,因為它幾乎影響了 C++ 的每個方面。本書也包括關于在 exceptions(異常)存在的場合下編程,在應用 design patterns(設計模式),以及在使用新的 TR1 庫程序(TR1 在 Item 54 中介紹)等方面的新的素材。本書還承認在 single-threaded systems(單線程系統)中能很好地工作的技術和方法可能不適用于 multithreaded systems(多線程系統)。噢,本書超過一半的素材都是新的。然而,第二版中基本原理方面的資料中的大部分依然是重要的,所以我將它們以這樣或那樣的形式保留下來。(你能在 [Appendix B](http://blog.csdn.net/fatalerror99/archive/2006/02/16/600754.aspx)([附錄 B](http://blog.csdn.net/fatalerror99/archive/2006/02/16/600754.aspx))找到第二版和第三版 Item 的對照表。)
我盡我所能使本書趨于最好,但我并不幻想完美。如果你覺得本書中的一些 Item 作為常規的建議不太合適;或者有更好的方法實現本書中需要完成的任務;或者有一個或更多技術上的討論不明確,不完全,或容易令人誤解,請告訴我。如果你發現任何錯誤——技術上的,文法上的,印刷上的,無論哪種——也請告訴我。如果你是第一個讓我注意到某個問題的人,我很高興將你的名字加入到以后再次印刷的致謝中。
即使 Item 的數量增加到 55,本書中的這一組準則離完滿無遺還差得很遠。但是成為好的規則——在幾乎所有的應用程序幾乎所有的時間中得到應用——比它看上去更加困難。如果你有增加準則的建議,我很高興能聽到它。
我維護本書從第一次印刷起的變化列表,包括錯誤修正,進一步解釋,和技術更新。這個列表可以從 _Effective C++ Errata_ 網頁得到,[http://aristeia.com/BookErrata/ec++3e-errata.html](http://aristeia.com/BookErrata/ec++3e-errata.html)。如果你希望當我更新列表時,你能得到通報,我建議你參加我的 mailing list(郵件列表)。我用它作為通告,發給那些對跟蹤我的職業工作感興趣的人們。關于細節問題,請參考 [http://aristeia.com/MailingList/](http://aristeia.com/MailingList/)。
SCOTT DOUGLAS MEYERS?????????????????????? STAFFORD, OREGON
[http://aristeia.com/](http://aristeia.com/)???????????????????????????? APRIL 2005
- Preface(前言)
- Introduction(導言)
- Terminology(術語)
- Item 1: 將 C++ 視為 federation of languages(語言聯合體)
- Item 2: 用 consts, enums 和 inlines 取代 #defines
- Item 3: 只要可能就用 const
- Item 4: 確保 objects(對象)在使用前被初始化
- Item 5: 了解 C++ 為你偷偷地加上和調用了什么函數
- Item 6: 如果你不想使用 compiler-generated functions(編譯器生成函數),就明確拒絕
- Item 7: 在 polymorphic base classes(多態基類)中將 destructors(析構函數)聲明為 virtual(虛擬)
- Item 8: 防止因為 exceptions(異常)而離開 destructors(析構函數)
- Item 9: 絕不要在 construction(構造)或 destruction(析構)期間調用 virtual functions(虛擬函數)
- Item 10: 讓 assignment operators(賦值運算符)返回一個 reference to *this(引向 *this 的引用)
- Item 11: 在 operator= 中處理 assignment to self(自賦值)
- Item 12: 拷貝一個對象的所有組成部分
- Item 13: 使用對象管理資源
- Item 14: 謹慎考慮資源管理類的拷貝行為
- Item 15: 在資源管理類中準備訪問裸資源(raw resources)
- Item 16: 使用相同形式的 new 和 delete
- Item 17: 在一個獨立的語句中將 new 出來的對象存入智能指針
- Item 18: 使接口易于正確使用,而難以錯誤使用
- Item 19: 視類設計為類型設計
- Item 20: 用 pass-by-reference-to-const(傳引用給 const)取代 pass-by-value(傳值)
- Item 21: 當你必須返回一個對象時不要試圖返回一個引用
- Item 22: 將數據成員聲明為 private
- Item 23: 用非成員非友元函數取代成員函數
- Item 24: 當類型轉換應該用于所有參數時,聲明為非成員函數
- Item 25: 考慮支持不拋異常的 swap
- Item 26: 只要有可能就推遲變量定義
- Item 27: 將強制轉型減到最少
- Item 28: 避免返回對象內部構件的“句柄”
- Item 29: 爭取異常安全(exception-safe)的代碼
- Item 30: 理解 inline 化的介入和排除
- Item 31: 最小化文件之間的編譯依賴
- Item 32: 確保 public inheritance 模擬 "is-a"
- Item 33: 避免覆蓋(hiding)“通過繼承得到的名字”
- Item 34: 區分 inheritance of interface(接口繼承)和 inheritance of implementation(實現繼承)
- Item 35: 考慮可選的 virtual functions(虛擬函數)的替代方法
- Item 36: 絕不要重定義一個 inherited non-virtual function(通過繼承得到的非虛擬函數)
- Item 37: 絕不要重定義一個函數的 inherited default parameter value(通過繼承得到的缺省參數值)
- Item 38: 通過 composition(復合)模擬 "has-a"(有一個)或 "is-implemented-in-terms-of"(是根據……實現的)
- Item 39: 謹慎使用 private inheritance(私有繼承)
- Item 40: 謹慎使用 multiple inheritance(多繼承)
- Item 41: 理解 implicit interfaces(隱式接口)和 compile-time polymorphism(編譯期多態)
- Item 42: 理解 typename 的兩個含義
- Item 43: 了解如何訪問 templatized base classes(模板化基類)中的名字
- Item 44: 從 templates(模板)中分離出 parameter-independent(參數無關)的代碼
- Item 45: 用 member function templates(成員函數模板) 接受 "all compatible types"(“所有兼容類型”)
- Item 46: 需要 type conversions(類型轉換)時在 templates(模板)內定義 non-member functions(非成員函數)
- Item 47: 為類型信息使用 traits classes(特征類)
- Item 48: 感受 template metaprogramming(模板元編程)
- Item 49: 了解 new-handler 的行為
- Item 50: 領會何時替換 new 和 delete 才有意義
- Item 51: 編寫 new 和 delete 時要遵守慣例
- Item 52: 如果編寫了 placement new,就要編寫 placement delete
- 附錄 A. 超越 Effective C++
- 附錄 B. 第二和第三版之間的 Item 映射