EffectiveC++:改善程式與設計的55個具體做法:第3版

EffectiveC++:改善程式與設計的55個具體做法:第3版

C++》系列(Effective C++,Effective C++》和1997年的《Effective

基本信息

圖書信息

書名:Effective C++ : 改善程式與設計的55個具體做法:第3版
作者:[美]Scott Meyers(斯考特.梅耶)著 侯捷 譯
ISBN:978-7-121-12332-0
出版日期:2011年1月
定價:定 價:65.00元

宣傳語

傳承大師智慧領悟技術本真
經典名著翻譯良品典藏不二之選
高效的classes、functions、templates和inheritance hierarchies(繼承體系)方面的專家級指導。
嶄新的“TR1”標準程式庫功能套用,以及與既有標準程式庫組件的比較。
洞察C++和其他語言(例如Java、C#、C)之間的不同。此舉有助於那些來自其他語言陣營的開發人員消化吸收C++式的各種解法。

作 者 簡 介

Scott Meyers是全世界最知名的C++軟體開發專家之一。他是暢銷書《Effective C++》系列(Effective C++,More Effective C++,Effective STL)的作者,又是創新產品《Effective C++ CD》的設計者和作者,也是Addison-Wesley的“Effective Software Development Series”顧問編輯,以及《Software Development》雜誌諮詢板成員。他也為若干新公司的技術諮詢板提供服務。Meyers於1993年自Brown大學獲得計算機博士學位。

譯 者 簡 介

侯捷是計算機技術書籍的作家、譯者、書評人。著有《深入淺出MFC》、《多型與虛擬》、《STL源碼剖析》、《無責任書評》三卷,譯有眾多膾炙人口的高階技術書籍,包括Meyers所著的“Effective C++”系列。侯捷兼任教職於元智大學、同濟大學、南京大學。 內 容 簡 介
有人說C++程式設計師可以分為兩類,讀過Effective C++的和沒讀過的。世界頂級C++大師Scott Meyers成名之作的第三版的確當得起這樣的評價。當您讀過這本書之後,就獲得了迅速提升自己C++功力的一個契機。
在國際上,本書所引起的反響,波及整個計算機技術的出版領域,餘音至今未絕。幾乎在所有C++書籍的推薦名單上,本書都會位於前三名。作者高超的技術把握力、獨特的視角、詼諧輕鬆的寫作風格、獨具匠心的內容組織,都受到極大的推崇和仿效。這種奇特的現象,只能解釋為人們對這本書衷心的讚美和推崇。
這本書不是讀完一遍就可以束之高閣的快餐讀物,也不是用以解決手邊問題的參考手冊,而是需要您去反覆閱讀體會的,C++是真正程式設計師的語言,背後有著精深的思想與無以倫比的表達能力,這使得它具有類似宗教般的魅力。希望這本書能夠幫您跨越C++的重重險阻,領略高處才有的壯美風光,做一個成功而快樂的C++程式設計師。

譯序

按孫中山先生的說法,這個世界依聰明才智的先天高下得三種人:先知先覺得發明家,後知後覺得宣傳家,不知不覺得實踐家。三者之中發明家最少最稀珍,最具創造力。正是匠心獨具的發明家創造了這個花花綠綠的計算機世界。
以文字、圖書、授課形式來講解、宣揚、引導技術的人,一般被視為宣傳家而非發明家。然而,有一類最高等級的技術作家,不但能將精闢獨到的見解訴諸文字,又能創造新的教學形式,引領風騷,對技術的影響和對產業的貢獻不亞於技術或開發工具的創造者。這種人當之發明家亦無愧矣。
Scott Meyers就是這一等級的技術作家!
自從1991年出版《Effective C++》之後,Meyers聲名大噪。1996年的《More Effective C++》和1997年的《Effective C++》2/e以及2001年的《Effective STL》讓他更上高樓。Meyers擅長探索程式語言的極限,窮盡其理,再以一支生花妙筆將複雜的探索過程和前因後果寫成環環相扣故事性甚強的文字。他的幽默文風也讓讀者在高張力的技術學習過程中猶能享受“閱讀的樂趣”——這是我對技術作家的最高禮讚。
以條款(items)傳遞專家經驗,這種寫作形式是否為Meyers首創我不確定,但的確是他造成了這種形式的計算機書籍寫作風潮。影響所及,《Exceptional C++》、《More Exceptional C++》、《C++ Gotchas》、《C++ Coding Standards》、《Effective COM》、《Effective Java》、《Practical Java》紛紛在書名或形式上“向大師致敬”。
睽違8年之後《Effective C++》第三版面世了。我很開心繼第二版再次受邀翻譯。Meyers在自序中對新版已有介紹,此處不待贅言。在此我適度修改第二版部分譯序,援引於下,協助讀者迅速認識本書定位。
C++ 是一個難學易用的語言!
C++ 的難學,不僅在其廣博的語法,以及語法背後的語義,以及語義背後的深層思維,以及深層思維背後的對象模型;C++ 的難學還在於它提供了四種不同而又相輔相成的編程范型(programming paradigms):procedural-based, object-based, object-oriented, generics。
世上沒有白吃的午餐!又要有效率,又要有彈性,又要前瞻望遠,又要回溯相容,又要治大國,又要烹小鮮,學習起來當然就不可能太簡單。在龐大複雜的機制下,萬千使用者前仆後繼的動力是:一旦學成,妙用無窮。
C++ 相關書籍車載斗量,如天上繁星,如過江之鯽。廣博如四庫全書者有之(The C++ Programming Language、C++ Primer、Thinking in C++),深奧如重山復水者有之(The Annotated C++ Reference Manual, Inside the C++ Object Model),細說歷史者有之(The Design and Evolution of C++, Ruminations on C++),獨沽一味者有之(Polymorphism in C++),獨樹一幟者有之(Design Patterns, Large Scale C++ Software Design, C++ FAQs),另闢蹊徑者有之(Generic Programming and the STL),程式庫大全有之(The C++ Standard Library),專家經驗之累積亦有之(Effective C++, More Effective C++)。這其中“專家經驗之累積”對已具 C++ 相當基礎的程式設計師有著立竿見影的幫助,其特色是輕薄短小,高密度納入作者浸淫C++/OOP多年的廣泛經驗。它們不但開展讀者的視野,也為讀者提供各種C++/OOP常見問題的解決模型。某些主題雖然在百科型C++ 語言書中也可能提過,但此類書籍以深度探索的方式讓我們了解問題背後的成因、最佳解法,以及其他可能的牽扯。這些都是經驗的累積和心血的結晶,十分珍貴。
《Effective C++》就是這樣一本輕薄短小高密度的“專家經驗累積”。
本中譯版與英文版頁頁對譯,保留索引,偶爾加上小量譯註;願能提供您一個愉快的學習。千里之行始於足下,祝願您從聲名崇隆的本書展開一段新里程。同時,我也向您推薦本書之兄弟《More Effective C++》,那是Meyers的另一本同樣盛名遠播的書籍。
侯捷2006/02/15於台灣新竹
英中簡繁術語對照
這裡列出本書出現之編程術語的英中對照。本中文版在海峽兩岸同步發行,因此我也列出本書簡繁兩版的術語對照,方便某些讀者從中一窺兩岸計算機用語。
表中帶有 * 者表示本書對該詞條大多直接採用英文術語。中英術語的選擇系由以下眾多考慮中取其平衡:
業界和學界習慣。即便是學生讀者,終也要離開學校進入職場;熟悉業界和學界的習慣用語(許多為英文),避免二次轉換,很有必要。
這是一本中文版,需顧及中文閱讀的感覺和順暢性。過多保留英文術語會造成版面的破碎與雜亂!然若適度保留英文術語,可避免某些望之不似術語的中文出現於字裡行間造成閱讀的困擾和停頓,有助於流暢的思考和留下深刻印象。
凡涉及C++ 語言關鍵字之相關術語皆保留。例如class, struct, template, public, private, protected, static, inline, const, namespace ……
以上術語可能衍生複合術語,例如與class相關的複合術語有base class, derived class, super class, subclass, class template …… 此類複合術語如果不長,盡皆保留原文;若太長則視情況另作處理(也許中英並陳,也許賦予特殊字型)。
凡計算機科學所稱之數據結構名稱,盡皆保留。例如stack, queue, tree, hashtable, map, set, deque, list, vector, array …… 偶爾將array譯為數組。
某些流通但不被我認為足夠理想之中譯詞,保留原文不譯。例如reference。
某些英文術語被我刻意以特殊字型表現並保留,例如pass by reference、pass by value、copy構造函式、assignment操作符、placement new。
少量術語為顧及詞性平衡,時而採用中文(如指針、類型)時而採用英文(如pointer、type)。
索引之於科技書籍非常重要。本書與英文版頁頁對譯,因此原封不動保留所有英文索引。
過去以來我一直不甚滿意object和type兩個術語的中譯詞:“對象”和“類型”,認為它們缺乏術語突出性(前者正確性甚至有待商榷),卻又頻繁出現影響閱讀,因此常在我的著作或譯作中保留其英文詞或偶爾採用繁體版術語:“物件”和“型別”。但現在我想,既然大家已經很習慣這兩個中文術語,也許我只是杞人憂天。因此本書採用大陸讀者普遍習慣的譯法。不過我仍要提醒您,"object" 在Object Oriented技術中的真正意義是“物體、物件”而非“對象、目標”。
以下帶有 * 者表示本書對該詞條采英文詞,不譯為中文
英文術語 簡體版譯詞 繁體版譯詞
abstract 抽象的 抽象的
abstraction 抽象性、抽象件 抽象性、抽象件
access訪問 存取、取用
access level 訪問級別 存取級別
access function 訪問函式 存取函式
adapter適配器 配接器
address地址 地址
address-of operator 取地址操作符 取址運運算元
aggregation 聚合 聚合
algorithm算法 演算法
allocate分配 配置
allocator分配器 配置器
application應用程式 套用程式
architecture體系結構 體系結構
argument實參 引數
*array 數組 陣列
arrow operator 箭頭操作符 箭頭運運算元
assembly language 彙編語言 組合語言
*assert(-ion)斷言 斷言
assign(-ment) 賦值 賦值
assignment operator 賦值操作符 賦值運運算元
*base class 基類 基礎類別
*base type基類型 基礎型別
binary search 二分查找 二分搜尋
*binary tree二叉樹 二元樹
binary operator 二元操作符 二元運運算元
binding綁定 綁定、繫結
*bit 位 位元
*bitwise (以bit為單元逐一 ……)
block 區塊 區塊
boolean 布爾值 布林值
breakpoint斷點 中斷點
build 建置 建置
build-in內置 內建
bus 匯流排 匯流排
*byte 位元組 位元組
cache 高速快取(區) 快取(區)
call 調用 呼叫
callback 回調 回呼
call operator call操作符 call運運算元
character 字元 字元
*child class 子類 子類別
*class 類 類別
*class template 類模板 類別模板
client客戶 客戶
code 代碼 程式碼
compatible 兼容 相容
compile time 編譯期 編譯期
compiler編譯器 編譯器
component組件 組件
composition 複合 複合
concrete 具象的 具象的
concurrent 並發 並行
configuration 配置 組態
connection連線 連線,連線
constraint約束(條件) 約束(條件)
construct 構件 構件
container 容器 容器
*const (C++ 關鍵字,代表constant)
constant常量 常數
constructor構造函式 建構式
*copy(動詞) 拷貝 拷貝、複製
copy(名詞) 復件、副本 復件、副本
create創建 產生、建立、生成
custom定製 訂製、自定
data 數據 資料
database資料庫 資料庫
data member 成員變數 成員變數
data structure 數據結構 資料結構
debug調試 除錯
debugger調試器 除錯器
declaration 聲明式 宣告式
default 預設 預設
definition定義式 定義式
delegate 委託 委託
dereference提領(解參考) 提領
*derived class 派生類 衍生類別
design pattern 設計模式 設計範式
destroy 銷毀 銷毀
destructor析構函式 解構式
directive指示符 指令
document文檔 檔案
dynamic binding 動態綁定 動態綁定
entity 物體 物體
encapsulation 封裝 封裝
*enum(-eration) 枚舉 列舉
equality相等 相等
equivalence等價 等價
evaluate 核定、核算 核定、核算
exception異常 異常
explicit顯式 顯式、明白的
expression 表達式 算式
file 檔案 檔案
framework框架 框架
full specialization 全特化 全特化
function函式 函式
function object 函式對象 函式物件
*function template 函式模板 函式模板
generic 泛型、泛化、一般化 泛型、泛化、一般化
*getter(相對於setter) 取值函式 取值函式
*global 全局的 全域的
*handle句柄 識別號、權柄
*handler處理函式 處理函式
*hash table哈希表、散列表 雜湊表
header (file)頭檔案 表頭檔
*heap 堆 堆積
hierarchy繼承體系(層次結構) 繼承體系(階層體系)
identifier標識符 識別字、識別符號
implement(-ation) 實現 實作
implicit隱喻的、暗自的、隱式 隱喻的、暗自的、隱式
information 信息 資訊
inheritance 繼承 繼承
*inline內聯 行內
initialization list 初值列 初值列
initialize 初始化 初始化
instance 實體 實體
instantiate 具現化、實體化 具現化、實體化
interface 接口 介面
Internet 網際網路 網際網路
interpreter解釋器 直譯器
invariants恆常性 恆常性
invoke調用 喚起
iterator疊代器 疊代器
library程式庫 程式庫
linker 連線器 連結器
literal 字面常量 字面常數
*list 鍊表 串列
load 裝載 載入
*local 局部的 區域的
lock 機鎖 機鎖
loop 循環 迴圈
lvalue左值 左值
macro宏 巨集
member成員 成員
member function 成員函式 成員函式
memory 記憶體 記憶體
memory leak 記憶體泄漏 記憶體洩漏
meta- 元- 超-
*meta-programming 元編程 超編程
modeling塑模 模塑
module 模組 模組
modifier修飾符 飾詞
multi-tasking 多任務 多工
*namespace 命名空間 命名空間
native固有的 原生的
nested嵌套 嵌套、巢狀
object對象 物件
object based 基於對象的 植基於物件、以物件為基礎
object model 對象模型 物件模型
object oriented 面向對象 物件導向
operand 運算元 運算元
operating system 作業系統 作業系統
operator操作符 運運算元
overflow溢出 上限溢位
overhead額外開銷 額外開銷
overload重載 重載
override 覆寫 覆寫
package 包 套件
parallel 並行 平行
parameter 參數、形參 參數
*parent class父類 父類別
parse 解析 解析
partial specialization 偏特化 偏特化
*pass by reference 按址傳遞 傳址
*pass by value 按值傳遞 傳值
pattern模式 範式
*placement delete (某種特殊形式的delete operator)
*placement new (某種特殊形式的new operator)
pointer指針 指標
polymorphism 多態 多型
preprocessor 預處理器 前處理器
print 列印 列印
printer 印表機 印表機
process進程 行程
program 程式 程式
programmer程式設計師 程式員
programming 編程 編程
project 項目 專案
pseudo code 偽碼 偽碼
quality質量 品質
*queue 佇列 佇列
raw 原始的、未經處理的 原始的、未經處理的
recursive遞歸 遞迴
refer to 指涉、指稱、指向 指涉、指稱、指向
*reference引用 參考、引用
regular expression 正則表達式 正則算式
resolve解析 決議
return 返回 回返、傳回
return type 返回類型 回返型別
return value返回值 回返值
runtime 運行期 執行期
rvalue 右值 右值
save 存儲 儲存
schedule 調度 排程
scheduler 調度器 排程器
scope 作用域 作用域
search 查找 搜尋
semantics語義 語意
*setter(相對於getter) 設值函式 設值函式
signature簽名(式) 簽名(式)
smart pointer 智慧型指針 智慧型指標
specialization 特化 特化
source 源碼 源碼
*stack 棧 堆疊
standard library 標準程式庫 標準程式庫
statement語句 述句
*static 靜態的 靜態的
string 字元串 字串
*subtype 子類型 子型別
support支持 支援
*template模板 範本
temporary object 臨時對象 暫時物件
text 文本 文字
thread 執行緒 緒程
thread safe多執行緒安全 多緒安全
throw拋、擲 拋、擲
token 語彙單元 語彙單元
type 類型 型別
unary function 單參函式 一元函式
underflow下溢 下限溢位
unqualified未經資格修飾 未經資格修飾
user 用戶 用戶
user interface 用戶界面 用戶介面
*value 值、數值 值、數值
variable變數 變數
*vector 矢量 向量
virtual function virtual函式 virtual函式
virtual machine 虛擬機 虛擬機器

序言

1991年我寫下《Effective C++》第一版。1997年撰寫第二版時我更新了許多重要內容,但為了不讓熟悉第一版的讀者感到困惑,我竭盡所能保留原始結構:原先50個條款中的48個標題基本沒變。如果把書籍視為一棟房屋,第二版只是更換地毯燈飾,重新粉刷一遍而已。
到了第三版,修繕工作進一步深入壁骨牆筋(好幾次我甚至希望能夠翻新地基)。1991年起C++ 世界經歷了巨大變革,而本書目標——在一本小而有趣的書中確認最重要的一些C++ 編程準則——卻已不再能夠由15年前建立的那些條款體現出來。“C++ 程式設計師擁有C背景”這句話在1991年是個合理假設,如今C++ 程式設計師卻很可能來自Java或C# 陣營。繼承(inheritance)和面向對象編程(object-oriented programming)在1991年對大多數程式設計師都很新鮮,如今程式設計師已經建立良好概念,異常(exceptions)、模板(templates)和泛型編程(generic programming)才是需要更多引導的領域。1991年沒人聽過所謂設計模式(design patterns),如今少了它很難討論軟體系統。1991年C++ 正式標準才剛要上路,如今C++ 標準規範已經8歲,新版規範蓄勢待發。
為了對付這些改變,我把所有條款抹得一乾二淨,然後問自己“2005年什麼是對C++ 程式設計師最重要的忠告?”答案便是第三版中的這些條款。本書有兩個新章,一個是資源管理(resource management),一個是模板編程(programming with templates)。實際上template(模板)這東西遍布全書,因為它們幾乎影響了C++ 的每個角落。本書新素材還包括在exceptions(異常)概念下編程、套用設計模式、
以及運用新的TR1程式庫設施(TR1於條款54描述)。本書也告訴大家在單執行緒系統(single-threaded systems)中運作良好但可能不適用於多執行緒系統(multithreaded systems)的某些技術和做法。本書半數以上內容是新的。在此同時第二版大部分基礎信息仍然很重要,所以我找出一個保留它們的辦法:你可以在附錄B找到第二、第三兩版的條款對應表。
我努力讓本書達到我所能夠達到的最佳狀態,但這並不表示它已臻完美。如果你認為某些條款不適合作為一般性忠告,或你有更好的辦法完成本書所談的某件工作,或書中某些技術討論不夠清楚不夠完全,甚或有所誤導,請告訴我。如果你找出任何錯誤——技術上的、文法上的、排版印刷上的,不論哪一種——也請告訴我。我很樂意將第一位提出問題並吸引我注意的朋友加入下次印刷的致謝名單中。
即使本書條款個數擴充為55,這一整組編程準則還談不上完備。然而畢竟整理出優良準則——幾乎任何時間適用於任何應用程式的準則——比想像中困難得多。如果你有其他編程準則的想法或建議,我將樂以與聞。
我手上維護本書第一刷以來的變化清單,其中包括錯誤修訂、進一步說明和技術更新。這份清單放在網址為的"Effective C++ Errata" 網頁上。如果你希望在這份清單更新時獲得通知,請加入我的郵件列表。這份列表用來發布訊息給可能對我的專業工作感興趣的人士,詳情請見。
Scott Douglas Meyers Stafford.Oregon
April 2005
致謝
《Effective C++》已經面世15年了,我開始學習C++ 則是在書寫此書的前5年。也就是說 "Effective C++項目" 已經發展兩個年代了。此期間我得益於數百(數千?)人的深刻知識、對我的建議與修正,以及偶發的一些目瞪口呆的事績。這些人幫助我更加完善《Effective C++》,我要對他們全體表示感謝。
我已經放棄追蹤“在哪兒學到什麼”的歷史,但永遠記得有個公眾信息來源不斷帶給我幫助:Usenet C++ newsgroups,特別是comp.lang.c++.moderated和comp.std.c++。本書許多——也許是大多數——條款得益於這些討論群所突出的若干技術想法和後續調查與診療。
關於第三版新內容,Steve Dewhurst和我一起討論了最初的條款名單。條款11中關於“藉由copy-and-swap實現operator=”的構想來自Herb Sutter在此主題的作品,像是《Exceptional C++》(Addison-Wesley, 2000)條款13。RAII(見條款13)源自Bjarne Stroustrup的《The C++ Programming Language》(Addison-Wesley, 2000)。條款17背後的想法來自Boost shared_ptr網頁上的“Best Practices”節區又得到Herb Sutter的《More Exceptional C++》(Addison-Wesley, 2002)條款21的琢磨。條款29強烈受到Herb Sutter在此主題上的廣泛作品的影響,像是《Exceptional C++》條款8~19,《More Exceptional C++》條款17~23,以及《Exceptional C++ Style》(Addison-Wesley, 2005)條款11~13;David Abrahams幫助我更好地了解三個異常安全性保證。條款35的NVI 手法來自Herb Sutter寫於《C/C++ Users Journal》2001年9月份的 "Virtuality" 專欄。同一條款中的Template Method和Strategy設計模式來自《Design Patterns》(Addison-Wesley, 1995),作者是Erich Gamma, Richard Helm, Ralph Johnson和John Vlissides。條款37所說的NVI使用手法,概念來自Hendrik Schober。David Smallberg 給了我動機在條款38寫出一個定製型set 實現品。條款39提到EBO通常只在多重繼承中才可用,這個構想源自David Vandevoorde和 Nicolai M. Josuttis合著的《C++ Templates》(Addison-Wesley, 2003)。條款42中我對typename的最初理解來自Greg Comeau主持的 "C++ and C FAQLeor Zolman則幫助我認知我的最初了解並不正確(是我的錯,和Greg無關)。條款46的本質源自於Dan Sak的談話,"Making New Friends"。條款52末尾的那個想法“如果你聲明一版operator new,你也應該聲明其對應的delete夥伴”源自Herb Sutter的《Exceptional C++ Style》條款22。我從David Abrahams身上更多了解了Boost的檢評過程(條款55有一份摘要)。
上面所說關於我向誰或從某處學習某一技術,並不必然表示誰或某處就是該技術的發明人或發表處。
我的筆記還告訴我,我也使用了來自Steve Clamage, Antoine Trux, Timothy Knox和Mike Kaelbling的信息,可惜這份筆記沒有提到如何以及在哪兒學到什麼。
第一版草稿由Tom Cargill, Glenn Carroll, Tony Davis, Brian Kernighan, Jak Kirman, Doug Lea, Moises Lejter, Eugene Santos, Jr., John Shewchuk, John Stasko, Bjarne Stroustrup, Barbara Tilly和Nancy L. Urbano共同檢閱。我收到了一些改善建議並納入後來刷次,這些建議來自Nancy L. Urbano, Chris Treichel, David Corbin, Paul Gibson, Steve Vinoski, Tom Cargill, Neil Rhodes, David Bern, Russ Williams, Robert Brazile, Doug Morgan, Uwe Steinmüller, Mark Somer, Doug Moore, David Smallberg, Seth Meltzer, Oleg Shteynbuk, David Papurt, Tony Hansen, Peter McCluskey, Stefan Kuhlins, David Braunegg, Paul Chisholm, Adam Zell, Clovis Tondo, Mike Kaelbling, Natraj Kini, Lars Nyman, Greg Lutz, Tim Johnson, John Lakos, Roger Scott, Scott Frohman, Alan Rooks, Robert Poor, Eric Nagler, Antoine Trux, Cade Roux, Chandrika Gokul, Randy Mangoba和Glenn Teitelbaum。
第二版草稿由以下人士共同檢閱:Derek Bosch, Tim Johnson, Brian Kernighan, Junichi Kimura, Scott Lewandowski, Laura Michaels, David Smallberg, Clovis Tondo, Chris Van Wyk和Oleg Zabluda。我收到來自以下人士的意見並因此對新刷有所幫助:Daniel Steinberg, Arunprasad Marathe, Doug Stapp, Robert Hall, Cheryl Ferguson, Gary Bartlett, Michael Tamm, Kendall Beaman, Eric Nagler, Max Hailperin, Joe Gottman, Richard Weeks, Valentin Bonnard, Jun He, Tim King, Don Maier, Ted Hill, Mark Harrison, Michael Rubenstein, Mark Rodgers, David Goh, Brenton Cooper, Andy Thomas-Cramer, Antoine Trux, John Wait, Brian Sharon, Liam Fitzpatrick, Bernd Mohr, Gary Yee, John O'Hanley, Brady Patterson, Christopher Peterson, Feliks Kluzniak, Isi Dunietz, Christopher Creutzi, Ian Cooper, Carl Harris, Mark Stickel, Clay Budin, Panayotis Matsinopoulos, David Smallberg, Herb Sutter, Pajo Misljencevic, Giulio Agostini, Fredrik Blomqvist, Jimmy Snyder, Byrial Jensen, Witold Kuzminski, Kazunobu Kuriyama, Michael Christensen, Jorge Yáñez Teruel, Mark Davis, Marty Rabinowitz, Ares Lagae和Alexander Medvedev.
第三版早期部分草稿由以下人士共同檢閱:Brian Kernighan, Angelika Langer, Jesse Laeuchli, Roger E. Pedersen, Chris Van Wyk, Nicholas Stroustrup和Hendrik Schober。完整草稿由以下人士共同檢閱:Leor Zolman, Mike Tsao, Eric Nagler, Gene Gutnik, David Abrahams, Gerhard Kreuzer, Drosos Kourounis, Brian Kernighan, Andrew Kirmse, Balog Pal, Emily Jagdhar, Eugene Kalenkovich, Mike Roze, Enrico Carrara, Benjamin Berck, Jack Reeves, Steve Schirripa, Martin Fallenstedt, Timothy Knox, Yun Bai, Michael Lanzetta, Philipp Janert, Guido Bartolucci, Michael Topic, Jeff Scherpelz, Chris Nauroth, Nishant Mittal, Jeff Somers, Hal Moroff, Vincent Manis, Brandon Chang, Greg Li, Jim Meehan, Alan Geller, Siddhartha Singh, Sam Lee, Sasan Dashtinezhad, Alex Marin, Steve Cai, Thomas Fruchterman, Cory Hicks, David Smallberg, Gunavardhan Kakulapati, Danny Rabbani, Jake Cohen, Hendrik Schober, Paco Viciana, Glenn Kennedy, Jeffrey D. Oldham, Nicholas Stroustrup, Matthew Wilson, Andrei Alexandrescu, Tim Johnson, Leon Matthews, Peter Dulimov和Kevlin Henney。某些個別條款的草稿由Herb Sutter和Attila F. Feher檢閱。
檢閱一份不夠洗鍊(而且可能尚未完成)的手稿是件吃力的工作,在時間壓力之下進行只會使得它更困難。我要感謝這么多人願意為我做這件事。
如果對討論素材缺乏背景,而又期望捕捉手稿中的每一個問題,檢閱工作將更加困難。令人驚訝的是還是有人選擇成為文字編輯。Chrysta Meadowbrooke是本書的文字編輯,她的周密工作揭露出許多逃過其他每一雙眼睛的問題。
Leor Zolman在正式檢閱前先以多種編譯器檢驗所有代碼,在我校訂手稿之後又做一次。如果書中仍然存在任何錯誤,全是我的責任。Karl Wiegers和(特別是)Tim Johnson提供我快速而有幫助的反饋。
John Wait是我的前兩版編輯,有點傻傻地又簽下這一份責任約。他的助理Denise Mickelsen熟練地處理我頻繁的糾纏,帶著愉快的微笑(至少我認為她是。呃,我從未見過她)。Julie Nahil 向來扮演救火隊角色並因此成為我的產品經理。她以非凡的鎮定指揮產品計畫內的六周通宵工作。John Fuller(她的老闆)和Marty Rabinowitz(他的老闆)也協助解決了產品發行量問題。Vanessa Moore的正式工作是提供FrameMaker和PDF支持,但她也協助製作附錄B的條目並格式化列印於封底里。Solveig Haugland協助將索引格式化。Sandra Schroeder和Chuti Prasertsith負責封面設計,Chuti總是在每次我說“如果把這張相片加上那個顏色的線條會怎樣?”時修訂封面。Chanda Leary-Coutu對市場行銷舉重若輕。
在我忙於手稿的數月之中,電視劇集Buffy the Vampire Slayer常常幫助我在每天工作結束後解壓。帶著極大的克制我才能夠不讓Buffyspeak的身影進入本書。Kathy Reed於1971年教我寫程式,我很高興我們保持友誼至今。Donald French雇用我和Moises Lejter於1989年建立起C++ 培訓教材(這項計畫誘使我真正了解C++),1991年他又聘我在Stratus Computer體現它們。該班學生鼓勵我寫下最終成為本書第一版的東西。Don也將我介紹給John Wait,他同意出版它們。
我的妻子Nancy L. Urbano持續鼓勵我寫作,即使在我完成了七本書、一張CD改寫版、一篇論文之後。她有令人難以置信的忍耐、自製與寬容。沒有她我無法完成我所完成的任何事情。
自始至終,我們的狗兒Persephone是我們無可取代的同伴。令人悲傷的是,在這個項目的大部分時間裡,她和我們之間的交往關係已經改為辦公室內的一壇骨灰瓮。我們十分懷念她。

目錄

譯序 vii
中英簡繁術語對照 ix
目錄 xvii
序言 xxi
致謝 xxiii
導讀 1
1. 讓自己習慣C++ 11
Accustoming Yourself to C++ 11
條款01:視C++ 為一個語言聯邦 11
View C++ as a federation of languages 11
條款02:儘量以const, enum, inline替換 #define 13
Prefer consts,enums, and inlines to #defines. 13
條款03:儘可能使用const 17
Use const whenever possible. 17
條款04:確定對象被使用前已先被初始化 26
Make sure that objects are initialized before they're used. 26
2. 構造/析構/賦值運算 34
Constructors, Destructors, and Assignment Operators 34
條款05:了解C++ 默默編寫並調用哪些函式 34
Know what functions C++ silently writes and calls. 34
條款06:若不想使用編譯器自動生成的函式,就該明確拒絕 37
Explicitly disallow the use of compiler-generated functions you do not want. 37
條款07:為多態基類聲明virtual析構函式 40
Declare destructors virtual in polymorphic base classes. 40
條款08:別讓異常逃離析構函式 44
Prevent exceptions from leaving destructors. 44
條款09:絕不在構造和析構過程中調用virtual函式 48
Never call virtual functions during construction or destruction. 48
條款10:令operator= 返回一個reference to *this 52
Have assignment operators return a reference to *this. 52
條款11:在operator= 中處理“自我賦值” 53
Handle assignment to self in operator=. 53
條款12:複製對象時勿忘其每一個成分 57
Copy all parts of an object. 57
3. 資源管理 61
Resource Management 61
條款13:以對象管理資源 61
Use objects to manage resources. 61
條款14:在資源管理類中小心copying行為 66
Think carefully about copying behavior in resource-managing classes. 66
條款15:在資源管理類中提供對原始資源的訪問 69
Provide access to raw resources in resource-managing classes. 69
條款16:成對使用new和delete時要採取相同形式 73
Use the same form in corresponding uses of new and delete. 73
條款17:以獨立語句將newed對象置入智慧型指針 75
Store newed objects in smart pointers in standalone statements. 75
4. 設計與聲明 78
Designs and Declarations 78
條款18:讓接口容易被正確使用,不易被誤用 78
Make interfaces easy to use correctly and hard to use incorrectly. 78
條款19:設計class猶如設計type 84
Treat class design as type design. 84
條款20:寧以pass-by-reference-to-const替換pass-by-value 86
Prefer pass-by-reference-to-const to pass-by-value. 86
條款21:必須返回對象時,別妄想返回其reference 90
Don't try to return a reference when you must return an object. 90
條款22:將成員變數聲明為private 94
Declare data members private. 94
條款23:寧以non-member、non-friend替換member函式 98
Prefer non-member non-friend functions to member functions. 98
條款24:若所有參數皆需類型轉換,請為此採用non-member函式 102
Declare non-member functions when type conversions should apply to all parameters. 102
條款25:考慮寫出一個不拋異常的swap函式 106
Consider support for a non-throwing swap. 106
5. 實現 113
Implementations 113
條款26:儘可能延後變數定義式的出現時間 113
Postpone variable definitions as long as possible. 113
條款27:儘量少做轉型動作 116
Minimize casting. 116
條款28:避免返回handles指向對象內部成分 123
Avoid returning "handles" to object internals. 123
條款29:為“異常安全”而努力是值得的 127
Strive for exception-safe code. 127
條款30:透徹了解inlining的里里外外 134
Understand the ins and outs of inlining. 134
條款31:將檔案間的編譯依存關係降至最低 140
Minimize compilation dependencies between files. 140
6. 繼承與面向對象設計 149
Inheritance and Object-Oriented Design 149
條款32:確定你的public繼承塑模出is-a關係 150
Make sure public inheritance models "is-a." 150
條款33:避免遮掩繼承而來的名稱 156
Avoid hiding inherited names. 156
條款34:區分接口繼承和實現繼承 161
Differentiate between inheritance of interface and inheritance of implementation. 161
條款35:考慮virtual函式以外的其他選擇 169
Consider alternatives to virtual functions. 169
條款36:絕不重新定義繼承而來的non-virtual函式 178
Never redefine an inherited non-virtual function. 178
條款37:絕不重新定義繼承而來的預設參數值 180
Never redefine a function's inherited default parameter value. 180
條款38:通過複合塑模出has-a或"根據某物實現出" 184
Model "has-a" or "is-implemented-in-terms-of" through composition. 184
條款39:明智而審慎地使用private繼承 187
Use private inheritance judiciously. 187
條款40:明智而審慎地使用多重繼承 192
Use multiple inheritance judiciously. 192
7. 模板與泛型編程 199
Templates and Generic Programming 199
條款41:了解隱式接口和編譯期多態 199
Understand implicit interfaces and compile-time polymorphism. 199
條款42:了解typename的雙重意義 203
Understand the two meanings of typename. 203
條款43:學習處理模板化基類內的名稱 207
Know how to access names in templatized base classes. 207
條款44:將與參數無關的代碼抽離templates 212
Factor parameter-independent code out of templates. 212
條款45:運用成員函式模板接受所有兼容類型 218
Use member function templates to accept "all compatible types." 218
條款46:需要類型轉換時請為模板定義非成員函式 222
Define non-member functions inside templates when type conversions are desired. 222
條款47:請使用traits classes表現類型信息 226
Use traits classes for information about types. 226
條款48:認識template元編程 233
Be aware of template metaprogramming. 233
8. 定製new和delete 239
Customizing new and delete 239
條款49:了解new-handler的行為 240
Understand the behavior of the new-handler. 240
條款50:了解new和delete的合理替換時機 247
Understand when it makes sense to replace new and delete. 247
條款51:編寫new和delete時需固守常規 252
Adhere to convention when writing new and delete. 252
條款52:寫了placement new也要寫placement delete 256
Write placement delete if you write placement new. 256
9. 雜項討論 262
Miscellany 262
條款53:不要輕忽編譯器的警告 262
Pay attention to compiler warnings. 262
條款54:讓自己熟悉包括TR1在內的標準程式庫 263
Familiarize yourself with the standard library, including TR1. 263
條款55:讓自己熟悉Boost 269
Familiarize yourself with Boost. 269
A 本書之外 273
B 新舊版條款對照 277
索引 280

相關搜尋

熱門詞條

聯絡我們