# Introduction(導言)
作者:Scott Meyers
譯者:fatalerror99 (iTePub's Nirvana)
發布:http://blog.csdn.net/fatalerror99/
學習一種編程語言的基礎是一回事;學習如何用那種語言設計和實現高效率的程序完全是另外一回事。對于 C++ ——一種以擁有非同尋常的能力范圍和表現力而自豪的語言——更是尤其如此。如果能正確使用,與 C++ 共事是一件令人快樂的事情。極多樣的設計樣式被直接表達并有效實現。對于 classes(類),functions(函數),以及 templates(模板)的明智選擇和小心精巧的安排能使應用程序的編程更加簡單,直觀,高效,并基本無錯。如果你知道如何去做,寫出高效的 C++ 程序并不特別難。然而,如果不經訓練就貿然使用,C++ 也會導致不可理解的,難以維護的,無法擴展的,低效率的,錯誤百出的代碼。
本書的目的在于引導你如何高效使用 C++。我假設你已經熟悉了作為語言的 C++ 并有使用它的一些經驗。我在此提供的是使用這種語言的指南,以使你的程序易于理解,可維護,易移植,可擴展,效率高,而且行為符合你的預期。
我提供的建議落在兩個主要的范圍中:普通的設計策略,以及特殊語言特性的具體細節。設計的討論集中于如何在 C++ 做某件事情的多種不同方法之間進行選擇。如何在 inheritance(繼承)和 templates(模板)之間選擇?如何在 public(公有)和 private inheritance(私有繼承)之間選擇?如何在 private inheritance(私有繼承)和 composition(復合)之間選擇?如何在 member(成員)和 non-member functions(非成員函數)之間選擇?如何在 pass-by-value(傳值)和 pass-by-reference(傳引用)之間選擇?在一開始就做出正確的決定是很重要的,因為一個不好的選擇可能會直到開發過程很晚的階段才顯現出來,在這時候再調整它常常是困難重重,極為耗時而且代價不菲的。
即使在你正確地知道你要做什么的時候,僅僅把事情做對也是需要技巧的。assignment operators(賦值運算符)的合適的返回類型是什么?destructor(析構函數)什么時候應該是 virtual(虛擬)的?當 operator new(運算符 new)找不到足夠的內存時它應該怎么辦?類似這些的令人費神的細節是至關重要的,因為錯誤的做法幾乎總是導致無法預料的,很可能令人迷惑的程序行為。這本書正是來幫助你避免這些問題的。
這不是一本全面的 C++ 手冊。它收集了 55 個詳細的提議(我將它們稱為 Items)告訴你怎樣才能改善你的程序和設計。每一個 Item 都能 stands more or less on its own(獨立成章),但大部分也包含對其它 Items 的參考。因而,讀這本書的一個方法就是從你感興趣的一個 Item 開始,然后順著它的參考條目繼續看下去。
這本書也不是一本 C++ 入門書。例如,在 Chapter 2(第二章),我希望能告訴你關于 constructors(構造函數),destructors(析構函數),以及 assignment operators(賦值運算符)正確實現的全部內容,但是我假設你已經知道或者能在別處找到這些函數做些什么以及它們該怎樣聲明的資料。大量 C++ 書籍包含類似這樣的信息。
這本書的目的是為了突出 C++ 編程中那些常常被忽略的方面。其它書描述了語言的各個部分。這本書則告訴你如何將這些部分結合起來以達到高效編程的最終目的。其它書告訴你如何使你的程序能夠編譯。這本書則告訴你如何避免那些編譯器不能告訴你的問題。
與此同時,本書將自己限制在 standard C++(標準 C++)之內。在此僅僅使用官方的語言標準中的特性。可移植性是本書一個關鍵的關注點,所以如果你要尋找平臺依賴的特性和部件,在這里不會找到。
另一個在本書中找不到的東西是 C++ Gospel(C++ 福音書)——通向完美的 C++ 軟件的一條 One True Path(真理之路)。本書中的每一個 Item 都在如何生成更好的設計,如何避免一般的問題,以及如何得到更高的效率等方面提供指導,但沒有一個 Item 是普遍適用的。軟件設計和實現是一項復雜的任務,被 hardware(硬件),operating system(操作系統),和 application(應用程序)的限制所影響,所以我能做的最好的事情就是為創建更好的程序提供 guidelines(指導方針)。
如果你在所有的時候都遵守這些 guidelines(指導方針),你將不太可能落入環繞在 C++ 周圍的大量陷阱中,但是作為 guidelines(指導方針)的固有限制,它總有例外。這就是為什么每一個 Item 都有一個詳細的解釋。這些解釋是本書中最重要的部分。只有理解了一個 Item 背后的基本原理,你才能決定它是否適合你開發的軟件以及你被困其下的特有的限制。
本書最好用來增加關于 C++ 如何運轉,為什么它會這樣運轉,以及如何讓它的行為為你服務等方面的知識。盲目運用本書的 Items 無疑是不適當的,但是與此同時,如果你沒有更好的理由,或許也不應該違反這些 guidelines(指導方針)中的任何一條。
- 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 映射