?? 勘誤:c++ primer中文版.txt
字號:
本勘誤檔更新日期: 2002/12/13
《C++ Primer 3/e 中文版》
Addison-Wesley. 峰資訊股份有限公司 合作出版, 1999
目前刷次: 1999/09 第一刷 印量 0001~3000
1999/10 第二刷 印量 3001~5000(版權(quán)頁記錄為 3001~4500,錯誤)
2000/03 第三刷 印量 5001~8000
2000/11 第四刷 印量 8001~11000
2001/10 第五刷 印量 11001~14000(2001修訂本。制版疏失以致未列版權(quán)頁)
2001修訂本特色:
1. 本表所載勘誤至 2001/07/23 止皆已修正於紙本
2. 目錄附黑色頁邊,有益查找
3. 改用網(wǎng)片印刷,網(wǎng)底效果極佳(唯 p252 原圖掃描效果不佳)
4. 摺口介紹 8 本循序漸進的好書
2002/08 第六刷 印量 14001~16500
原著:C++ Primer 3/e,
by Stanly B. Lippman & Josee Lajoie,
Addison Wesley/1998
注意:英文版 1999.08.10 之前的勘誤已直接修正於中文版內(nèi)。
原文書的 errata 在
(1) http://people.we.mediaone.net/stanlipp/index.html
(2) http://www.awl.com/cseng/titles/0-201-82470-1/
注意:自 2000/05/18 之後的勘誤條款,皆加上修正日期,
并以日期排序,以利您的尋找。
======================================================
書籍內(nèi)容更正,有兩種作法,一是在網(wǎng)際網(wǎng)路上做個專屬勘誤
網(wǎng)頁,讓大家上去看。這是比較即時的作法。而更理想更負責(zé)
的作法是:不但有勘誤網(wǎng)頁,并且在新刷中予以更正 -- 如果
有新刷的話。
不過,理想與現(xiàn)實之間需要一點協(xié)調(diào)。書籍的制作是這樣的,
制版與印刷時,是以臺(8 或 16 頁)為單位。因此,每換一
頁,同臺的各頁統(tǒng)統(tǒng)要換過。這便造成印制成本的大量增加。
以前,我從不考慮成本,只要我認為書籍內(nèi)容有修改必要,即
使只是某個字詞用得不甚理想,我都會請出版社更新。出版社
也都全力配合(這一點讓我非常感謝)。
慢慢地,我的行事不再這麼霹靂,我覺得我多少也要站在出版
社的立場想想。所以我打算,如果是關(guān)系到對錯正誤的根本性
問題,我便一定在新刷修正。如果是易判別的錯別字或排版誤
失或用詞不很恰當(dāng)┅等等,我便先在勘誤網(wǎng)頁上明載,但不求
立刻於新刷中更正。直到收集來的這類誤失較為密集了,才一
并於下一刷修正。
哪些是新刷已修正的,哪些是暫請讀者自行動手更改的,我會
在勘誤網(wǎng)頁(網(wǎng)址見書封底)上很清楚地說明。
這是個便宜法門,請讀者見諒。
書籍應(yīng)該在出版前就詳細檢查,以完美之姿出現(xiàn)。但是完美很
難達到。對於下列大大小小輕重不等的誤失,我謹向讀者說抱
歉。
本檔歡迎廣為流傳,謝謝。
以下為更新記錄。如果您購買的是第 n 刷,請將以下第 n+1
刷之後的更新內(nèi)容自行修正至?xí)稀Vx謝
======================================================
二刷更正內(nèi)容:
(注意,Lm 表示第 m 行,L-n 表示倒數(shù)第 n 行)
■導(dǎo)讀 p23
原文:
template <typename T>
T func( T p1, T p2, int p3 ) // ( T p1, T p2, int p3 ) 稱為 template parameter list
{ ... } // p1, p2 稱為型別叁數(shù)(type parameter)
// p3 稱為非型別叁數(shù)(nontype parameter)
更正:
template <typename T> // <typename T> 稱為 template parameter list
T func( T p1, T p2, int p3 ) // 其中 T 是 template type parameter(型別叁數(shù))
{ ... } // 另有所謂 template nontype parameter(非型別叁數(shù)),
// 本例未出現(xiàn)。
■p36 L-2
原文:當(dāng)它後面緊跟著一個 class 名稱
更正:當(dāng)它緊跟著一個 class 名稱後面
感謝:黃向陽先生
■p106 L17(原書筆誤)
原文:int *&ptrVal2 = pi;
更正:int *&refPtr = pi;
感謝:黃向陽先生
■p342: L-4(原書筆誤)
原文:以下示范利用 rswap() 交換兩個指標(biāo)
更正:以下示范利用 ptrswap() 交換兩個指標(biāo)
■p496: L13
原文:inline 或 extern 修飾詞應(yīng)該放在 template 叁數(shù)列之前,而非┅
更正:inline 或 extern 修飾詞應(yīng)該放在 template 叁數(shù)列之後,而非┅
■p1130: copy_backward() 下的第二段文字(原書錯誤)
原文:
例如,給予數(shù)列 {0,1,2,3,4,5},我們可以復(fù)制最後三個元素 (3,4,5) 到
最前三個元素 (0,1,2) 身上,作法是將 first 設(shè)定為元素 0 的位址,
last1 設(shè)定為元素 3 的位址,last2 設(shè)定為元素 5 的下一個位址。
於是元素 5 會被指定到原來的元素 2 身上,元素 4 會被指定到原來的元素 1 身上,
元素 3 會被指定到原來的元素 0 身上。最後的結(jié)果是 {3,4,5,3,4,5}。
更正:
例如,給予數(shù)列 {0,1,2,3,4,5},我們可以復(fù)制最前三個元素 (0,1,2) 到
最後三個元素 (3,4,5) 身上,作法是將 first 設(shè)定為元素 0 的位址,
last1 設(shè)定為元素 3 的位址,last2 設(shè)定為元素 5 的下一個位址。
於是元素 2 會被指定到原來的元素 5 身上,元素 1 會被指定到原來的元素 4 身上,
元素 0 會被指定到原來的元素 3 身上。最後的結(jié)果是 {0,1,2,0,1,2}。
================================================================
三刷更正內(nèi)容:
(注意,Lm 表示第 m 行,L-n 表示倒數(shù)第 n 行)
■p252 圖片過於粗糙,重制。
■p318 最後一段第二行(誤譯)
原文:這種作法之所以能夠成功,是因為這些 containers 保證其
元素實體會以連續(xù)的方式出現(xiàn)(存在)。
更正:這種作法之所以能夠成功,是因為這些 containers 保證其
鍵值相同的元素會連續(xù)出現(xiàn)(存在)。
■p322 最後一段第二行(修潤)
原文:我們稱 stack 為一種所謂的 container adapter,因為它
在底層的 container 集合體身上課徵 stack 抽象性質(zhì)。
更正:我們稱 stack 為一種所謂的 container adapter,因為它
系利用底層各類型 container 加工完成 stack 抽象性質(zhì)。
■p495, L4(原書筆誤)
原文:// ok: Type used many times in template parameter list
更正:// ok: Type used many times in function parameter list
感謝:kylin
■p501, L12(中譯本誤植)
原文:min2() 的第一個函式叁數(shù)是個型別為 *Type 的指標(biāo)。
更正:min2() 的第一個函式叁數(shù)是個型別為 Type* 的指標(biāo)。
■p503, L-5(原書筆誤)
原文:上述的 template 引數(shù) T 從第一個函式引數(shù)中推導(dǎo)得 int,
又自第二個函式引數(shù)中推導(dǎo)得 unsigned int,因此 template 引數(shù)推導(dǎo)失敗。
更正:上述的 template 引數(shù) T 從第一個函式引數(shù)中推導(dǎo)得 unsigned int,
又自第二個函式引數(shù)中推導(dǎo)得 int,因此 template 引數(shù)推導(dǎo)失敗。
感謝:leetron
■p565, L7(原書筆誤)
原文:Exception declaration 是函式介面的一部份,所以它必須...
更正:Exception specification 是函式介面的一部份,所以它必須...
■p576, 最上(中譯稿漏印,缺少兩個右大括號)
原文: // ...
更正: }
// ...
}
注意:我在本書第三刷(3/p)中將 p575 和 p576 相鄰處的 layout 做了
一點點挪移,所以第三刷的讀者在 p576 最上所見并非上述那樣子。請勿疑慮。
■p595, L-5
原文:當(dāng)然,「令一個 non-const iterator 指向一個 const iterator」總是可以的。
更正:當(dāng)然,「將一個 non-const iterator 指派給一個 const iterator」總是可以的。
■p596(原書筆誤)
說明:本頁下方有三點,討論 back_inserter, front_inserter, inserter.
并均利用 unique_copy() 做為使用范例。每一個 unique_copy() 都
遺漏了最後的右大括弧。
更正:請為 unique_copy() 加上最後的右大括弧。
感謝:Megadeth
■p652, L-1(中譯稿漏印,少了最後一行)
原文:有著以下的型別:
更正:有著以下的型別: int (Screen::*)()
■p731, 第一段(中譯誤失)
原文:
舉個例子,如果我再次修改 Account class 的定義,令 _name 的型別為 string,
那麼預(yù)設(shè)的 memberwise 指派動作:
newAcct = oldAcct;
就會被編譯器喚起,猶如編譯器為我們產(chǎn)生了以下的 copy assignment 運算子:
更正:
舉個例子,如果我再次修改 Account class 的定義,令 _name 的型別為 string,
那麼當(dāng):
newAcct = oldAcct;
預(yù)設(shè)的 memberwise 指派動作就會被編譯器喚起,猶如編譯器為我們產(chǎn)生了
以下的 copy assignment 運算子:
■p915, 第二段文字,第一行(譯筆不佳,重譯)
原文:一個 derived class constructor 只能合法地喚起其
「直接 base class」的 constructor
更正:一個 derived class constructor 能夠合法直接喚起的 construtor 只有其
「直接 base class」的 constructor
■p915, 17.4.4 的標(biāo)題(修潤)
原文:17.4.4 惰式錯誤偵測(Lazy Error Detection)
更正:17.4.4 緩式錯誤偵測(Lazy Error Detection)
注意:請同時修改
p.ix, 目錄
p.916, L6
p.981, 18.3.2 標(biāo)題前兩行
p.984, L-6
p.1224, 索引
討論:我想,譯為「緩式」可能比譯為「惰式」更符合華人用語。在 Scott Meyers
的《More Effective C++》item17 "Consider using lazy evaluation" 中,
對於 Lazy evaluation 有深刻的解說,并提出一個對應(yīng)詞:eager evaluation。
我把 eager evaluation 譯為「急式評估」。
■p941, 17.5.8 標(biāo)題(誤譯)
原文:虛擬函式、虛擬解構(gòu)式 constructor、虛擬解構(gòu)式 destructor
更正:在建構(gòu)式(constructors)與解構(gòu)式(destructors)中呼叫虛擬函式
注意:請同時修改目錄 (p.x)
■p1006, L-13(譯筆不佳,重譯)
原文:一旦成為 base class,class template 必須完整列出其叁數(shù)列。
修改:欲令一個 class template 扮演 base class 的角色,我們必須完整列出其叁數(shù)列。
■p1045 19.2.7 標(biāo)題(筆誤)
原文:19.2.7 Constructors(解構(gòu)式)和 Function try Blocks 的關(guān)系
更正:19.2.7 Constructors(建構(gòu)式)和 Function try Blocks 的關(guān)系
感謝:leetron
注意:請同時修改目錄 (p.x)
■p1126, adjacent_difference 內(nèi)文第二行(誤譯)
原文:給予數(shù)列 {0,1,1,2,3,5,8},新數(shù)列的 first 元素是
原數(shù)列的 first 元素的拷貝:0。
更正:給予數(shù)列 {0,1,1,2,3,5,8},新數(shù)列的第一個元素是
原數(shù)列的第一個元素的拷貝:0。
■p1126, L-15, p1127, L9(原書錯誤)
說明:這兩行出現(xiàn)的 times,是某 function object 的舊名稱,
在 C++ standard 中已改名為 multiplies. 見 p590
更正:將這兩行出現(xiàn)的 times<int> 改為 multiplies<int>
■p1127, adjacent_find() 第二版本規(guī)格,最後一行(原書錯誤)
原文:ForwardIterator last, Predicate pred);
更正:ForwardIterator last, BinaryPredicate pred);
■p1128, binary_search() 第二版本規(guī)格,缺一行(原書遺漏)
原文:bool
binary_search(ForwardIterator first,
ForwardIterator last, const Type &value,
Compare comp);
更正:請在 bool 前面加上一行
template <class ForwardIterator, class Type, class Compare>
■p1149, inner_product() 規(guī)格說明最後一行(原書錯誤)
原文: (2+1) - (3+2) - (5+3) - (8+4)
更正:- (2+1) - (3+2) - (5+3) - (8+4)
■p1166, L9, L20(原書錯誤)
■p1167, L1, L3 (原書錯誤)
說明:這四行出現(xiàn)的 times,是某 function object 的舊名稱,
在 C++ standard 中已改名為 multiplies. 見 p590
更正:將這四行出現(xiàn)的 times<int> 改為 multiplies<int>
■p1177, rotate() 規(guī)格說明第一行(原書錯誤)
原文:rotate() 會將 [first,middle) 范圍內(nèi)的元素搬移到 container 尾端。
更正:rotate() 會將 [first,middle) 范圍內(nèi)的元素搬移到 last 所指位置。
■p433, p434, p453, p454, p767, p769, p770, p771, p774, p781, p790,
p849, p863, p865, p866, p881, p898, p911, p914
字體變小,制版不當(dāng)(做了縮版動作)。第三刷已重新制版。
==================================================================
★英文 dimension 一詞用於陣列有兩義:(1) 維度 (2) 尺度(元素個數(shù))
我在翻譯過程中一時拘泥,譯得不好。現(xiàn)重新檢討如下(抱歉,頁數(shù)頗多):
■p24: L-13
原文:陣列的名稱是 fibon。這是一個整數(shù)陣列,維數(shù)為 9。
更正:陣列的名稱是 fibon。這是一個整數(shù)陣列,尺度(元素個數(shù))為 9。
■p24: L-6
原文:最後一個元素,我們應(yīng)該把維數(shù)減 1 做為索引值
更正:最後一個元素,我們應(yīng)該把尺度(元素個數(shù))減 1 做為索引值
■p28: L-9
原文:new 算式的第二個版本配置出一個特定型別和特定維數(shù)的陣列。
更正:new 算式的第二個版本配置出一個特定型別和特定尺度(元素個數(shù))的陣列。
■p34: L7
原文:我把陣列的維數(shù)指定給 array_size。
更正:我把陣列的大小指定給 array_size。
■p114: 最後一段文字
原文:
陣列的定義系由型別符號、識別名稱、維度(dimension)三者構(gòu)成。
維度以一個中括號表示,指出陣列之中有多少元素。陣列的維度大小必須
大於或等於 1。維度值必須是一個常數(shù)算式,也就是說,它必須能夠在
編譯時期便被編譯器核定(evaluate)其值。換言之一個 non-const
變數(shù)不能夠用來指定陣列的維度大小。
更正:
陣列的定義系由型別符號、識別名稱、尺度(dimension)三者構(gòu)成。
尺度以一個中括號表示,指出陣列之中有多少元素。陣列的尺度必須
大於或等於 1。尺度必須是一個常數(shù)算式,也就是說,它必須能夠在
編譯時期便被編譯器核定(evaluate)其值。換言之一個 non-const
變數(shù)不能夠用來指定陣列的尺度大小。
■p115: L2
原文:只能夠在執(zhí)行時期完成,所以它不能夠用來指定陣列維度。
更正:只能夠在執(zhí)行時期完成,所以它不能夠用來指定陣列尺度。
■p115: L-13
原文:面對一個明白初始化的陣列,你不需要再指定其維度,
更正:面對一個明白初始化的陣列,你不需要再指定其尺度,
■p115: L-9
原文:如果維度被明白指出,那麼串列中的元素個數(shù)就不能夠超越該值,
更正:如果尺度被明白指出,那麼串列中的元素個數(shù)就不能夠超越該值,
■p116: L1
原文:ca1 的維度值是 3 而 ca2 的維度值是 4。
更正:ca1 的尺度(元素個數(shù))是 3 而 ca2 的尺度是 4。
■p162: L8
原文:像是陣列的維數(shù),或是 template 的 nontype 叁數(shù)。
更正:像是陣列的尺度(元素個數(shù)),或是 template 的 nontype 叁數(shù)。
■p415: L13
原文:以 new 算式配置獲得的陣列,其維度可被指定為┅
更正:以 new 算式配置獲得的陣列,其尺度(元素個數(shù))可被指定為┅
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -