七刷  2000 冊 (2006 下半 )  
六刷  2000 冊 (2005          )  
五刷  3000 冊 (2004/12/13)  
四刷  6000 冊 (2002/09/    )  
三刷  6000 冊 (2002/01/12)  
二刷  6000 冊 (2001/09/28)  
一刷 10000 冊 (2001/08/25)  

《Essential C++》
簡體中文版

侯捷 譯

essential-cpp-gb.jpg (375932 bytes)

簡體版 勘誤


出版簡訊 / 華中科技大學出版社計算機編輯室暨市場部

親愛的讀者朋友﹕您好

C++初學者有福了﹗

由聞名于世的C++大師級作家Stanley B.Lippman 精心撰寫﹐由台灣著名IT技術作家侯捷先生傾力翻譯的一本C++入門好書《Essential C++ 中文版》2001年8月由華中科技大學出版社正式出版時間。第一次印刷的10000冊書不到一個半月即供不應求﹐9月進行了第二次印刷,三個月即告售罄。目前﹐我們根據侯捷網站上的勘誤表進行了認真修改,再次重印6000冊,預計春節前可以發往全國各地。

本書採用國際16開本﹐300頁﹐封面為進口250克銅版紙加勒口﹐覆光膜﹐內芯為白度很好的70克江蘇高級雙膠紙。封面貼有華中科技大學出版社(原華中理工大學出版社)的激光防偽商標﹐封底貼有Pearson Education公司提供的激光防偽商標(商標上的文字為 "Pearson Education")。書脊上則印有Addison Wesley 公司的名字和徽標。

定價﹕39.80元/冊。

本書在全國的首發書店(包括網上書店)名稱和電話均公佈在侯捷網站。如有疑問﹐歡迎發來郵件或到如下網址留言﹕

junzhou@public.wh.hb.cn
http://yeka52.yeah.net
http://yeka.xilubbs.com (好書──你說﹐我說)


華儲網上電腦書店是我們在網上的重要經銷商﹐他們服務週到 、及時 、準確﹐因此﹐我們敬向廣大中小城市和農村中買書不方便的讀者鄭重推薦華儲網上電腦書店(http://www.huachu.com.cn)。

華中科技大學出版社市場部暨計算機編輯室敬上

附﹕本書在全國各大城市首發的書店和網站如下﹕

沈陽﹕遼寧華儲資訊科技有限責任公司 024-83892148
華儲網上電腦書店(www.huachu.com.cn)

北京﹕海淀圖書城昊海樓電子科技書店 010-62534720﹐62534721
西單圖書大廈 010-66078518
CSDN網站暨《程序員》雜誌社 64993616-270

上海﹕新風雨網絡書城(www.cnforyou.com)021-36033538
中國科技圖書公司 021-63234567
上海交大昂立科技有限公司 32032812﹐32032811

武漢﹕武漢電子科技書店 87879661
武漢市洪山科技圖書發行有限公司 87881657
華中科技大學出版社讀者服務部 87544529

廣州﹕廣州天河天鼎科技圖書有限公司(簡稱天鼎書店) 020-87506587
廣州金地科技有限公司 020-87782496 8765409
深圳﹕深圳市科技書店 3634184﹐ 3634189
深圳大學教材服務中心 6537102﹐ 6534105
天津﹕天津計算機書店(天津市柏特商貿有限公司) 28365950﹐27830190
天津市南開區文友書店 022-27402942
西安﹕西安天意圖書發行有限公司 7441380
陝西省外文書店圖書音像批銷中心 029-7279886
成都﹕成都市都樂科技圖書有限公司 3335219
成都教育考試書店 028-5410792
重慶﹕重慶新華書店(集團)有限責任公司 68428344
重慶交通學院學生工作部 7781659
南京﹕南京科海科技書店 025-3328998
南京市新華書店 (025)6642336
杭州﹕浙江大學科海電子技術公司 0571-7951140
杭州藍晶電子技術開發有限公司 0571-8805813
長沙﹕長沙科技書店 2237168
博源圖書有限公司 0731-4424450
合肥﹕安徽春秋書社科技圖書發行服務部 0551-3661104
合肥市新時代電腦科技書店 0551-3667678
哈爾濱﹕哈爾濱金北方科技開發有限公司 6415498﹐6412070
哈爾濱市學府書店 0451-6608030 6674514
鄭州﹕鄭州金宇科技書店 3942742(13503995165
鄭州電子科技書店 0371-6251394
福州﹕福建省福州市新華書店 0591-7528487
廈門﹕廈門對外圖書交流中心 0592-5054027
大連﹕大連理工大學出版社教育書店 0411-4708970
濟南﹕濟南泉城科技圖書發行有限公司 0531-6950876 699199
山東智能人科技書店 0531-8934878-3
太原﹕山西春雨實有限公司 0351-4122793
蘭州﹕蘭州七里河計算機書店 0931-2311243 8840555

如果您對本書有出版上的意見和建議﹐請您給編輯來信﹕
junzhou@public.wh.hb.cn

感謝您對我們的鼓勵和支持﹐我們會更加努力。緊握您的手
華中科技大學出版社計算機編輯室暨市場部敬上(2001年8月5日)


滿漢全席之外(譯序/侯捷)

Stanley B. Lippman 所著的 C++ Primer 雄踞書壇歷久不衰,堪稱 C++ 最佳教本。但是走過 10 個年頭之後,繼 1237 頁的 C++ Primer 第三版,Lippman 又返樸歸真地寫了這本 276 頁的Essential C++。有了滿漢全席,為何還眷顧清粥小菜?完成了偉大的鉅著,何必回頭再寫這麼一本輕薄短小的初學者用書呢?

所有知道 Lippman 和 C++ Primer 的人,臉上都浮現相同的問號。

輕薄短小並不是判斷適合初學與否的依據。Lippman 寫過Inside the C++ Object Model,280 頁小開本,崩掉多少C++ 老手的牙齒。本書之所以號稱適合初學者,不在於輕薄短小,在於素材的選擇與組織的安排。

關於 Lippman 重作馮婦的故事,他自己在前言(p.ix)中有詳細的介紹。他的轉折,他的選擇,他的職責,乃至於這本書的綱要和組織,前言中都有詳細的交待。這方面我不必再置一詞。

身為C++ Primer (3/e) 的譯者,以及多本進階書籍的作者,我必須努力說服自己,才能心甘情願地將精力與時間用來重複過去的足跡。然而,如果連 Lippman 都願意為初學者再鋪一條紅地毯,我也願意為初學者停留一下我的腳步。

* * * * * * * * * * * * * * * * * * * *

我是一名資訊教育工作者,寫譯書籍,培訓業界人員,主持網站回應讀者與學員,並於大學開課。我真正第一線面對大量學習者。藉此機會我要表達的是,所謂「初學者」實在是個過於籠統的名詞與分類(呃,談得上分類嗎)。一般所謂「初學者」,多半想像是大一或專一新生程度。其實 C++ 語言存在各種「初學者」,有 13 歲的,有 31 歲的(當然也有 41 歲的)。只要是第一次接觸這個語言,就是這個語言的初學者,他可能才初次接觸電腦,可能浸淫Pascal/C 語言 10 年之久,或可能已有 Smalltalk/Java 三年經驗。有人連電腦基本概念都沒有,有人已經是經驗豐富的軟體工程師。這些人面對 C++,學習速度、教材需求、各人領悟,相同嗎?

大不同矣!

每個人都以自己的方式來詮釋「初學者」這個字眼,並不經意地反映出自己的足跡。初學者有很多很多種,「初學者」一詞卻無法反映他們的真實狀態。

* * * * * * * * * * * * * * * * * * * *

固然,輕薄短小的書籍乍見之下讓所有讀者心情輕鬆,但如果捨棄太多應該深入的地方不談,也難免令人行止失據,進退兩難。這本小書可以是你的起點,但絕不能夠是你的終站。

做為一本優秀教本,輕薄短小不是重點,素材的選擇與組織的安排,表達的精準與閱讀的順暢,才是重點。

做為一個好的學習者,背景不是重點,重要的是,你是否具備正確的學習態度。起步固然可從輕鬆小品開始,但如果碰上大部頭鉅著就退避三舍逃之么么,面對任何技術只求速食速成,學語言卻從來不寫程式,那就絕對沒有成為高手乃至專家的一天。

有些人的學習,自練一身銅筋鐵骨,可以在熱帶叢林中披荊斬棘,在莽莽草原中追奔逐北。有些人的學習,既未習慣大部頭書,也未習慣嚴謹格調,更未習慣自修勤學,是溫室裡的一朵花,沒有自立自強的本錢。

* * * * * * * * * * * * * * * * * * * * *

章節的安排,篇幅的份量,索引的保留,習題和解答,網上的服務,都使這本小書成為自修妙品,或C++ 專業課程的適當教材。我誠摯希望《Essential C++ 中文版》的完成,幫助更多人從中獲得 C++ 的學習樂趣 - 噢,是的,物件導向程式語言可以帶給你很多樂趣,我不騙你。

侯捷 2001/07/18

jjhou@jjhou.com
http://www.jjhou.com(繁體),
http://www.csdn.net/expert/jjhou(簡體)


本書(簡體版)係以繁體版為基礎,由王凱、孟岩兩位先生轉譯為簡體,合力修潤,並將書中術語改為大陸習慣用語。整個製作過程中,侯捷、王凱、孟岩、以及責任編輯周筠女士,經過多次的檢閱與討論。

我們所盼望呈現的,是符合內地閱讀習慣的一本讀物。然而以下術語,根據我個人長期在科技實業界、教育界、寫譯界的經驗,決定保留繁體版譯法:

英文術語 大陸慣用譯法 本書譯法
adapter 適配器 配接器
argument 實參(實質參數) 引數
by reference 傳參考,傳地址 傳址
by value 傳值  傳值
dereference 反引用,解參考 提領
evaluate 評估,計算 評估, 核定
instance 案例,實例 實體
library 庫,函數庫 程序庫
range 範圍 區間(使用於STL時)
resolve 解析 決議
parameter 形參(形式參數) 參數
type 類型 型別


以上都是基於我個人對術語實際意義的理解、術語譯詞的選擇理念(獨特而不易混淆)、以及文字精美的考量(儘量使用二字詞)等等,所做的決定。術語的選用,無法令每個人滿意,這種情況兩岸皆同。在此特別提醒您注意以上用法。

本書繁體版由王建興先生擔任初譯工作,並同掛譯者之名。由於建興未涉及簡體版的製作,所以未列名於簡體版封面。但我仍要在此感謝建興的貢獻。同時,我更要感謝王凱、孟岩、周筠三位先生女士的努力。一本書籍的英譯中,繁轉簡,有很多很多專業技術的、行文遣字的、庶務性的工作在其中。我們都希望將書籍做到完美,但人世間沒有完美。請上本書支援網站(載於封底)觀看後續的討論、勘誤、程式範例。

請注意:
1. 侯捷網站上所列之繁體版勘誤表(依日期排列),其中2001/07/18前的錯誤皆已於簡體版修正完畢。本簡體版另有獨立之勘誤表。
2. 本書與英文版頁頁對譯,俾得以保留原書索引。
3. 本書附加中英術語對照表於附錄 C。
4. 本書已依英文版第一刷(1st printing)勘誤表加以修正
5. 本書源碼(source code)可自侯捷網站下載。

侯捷網站:
http://www.jjhou.com(繁體)
http://www.csdn.net/expert/jjhou(簡體)


前言 / Lippman

天啊,這本書竟是如此輕薄短小。我真想大叫一聲哇歐!C++ Primer 加上索引、扉頁、謝詞之後,厚達 1237 頁,而此書卻薄薄只有 276 頁。套句拳擊術語,這是一本「羽量級」作品。

每個人都會好奇地想知道這究竟是怎麼回事。裡頭的確有一段故事。

過去數年來,我不斷纏著華德迪士尼電影動畫公司(Disney Feature Animation)的每一個人,要求讓我親身參與一部電影的製作。我纏著導演,甚至Mickey 本人(如果我可以說出來的話),要求一份管理工作。我會如此瘋狂,部份原因是深陷於好萊塢大螢幕那令人神往的無盡魔力而難以自拔。除了電腦科學方面的學位,我還擁有藝術碩士的頭銜,而電影工作似乎可以為我帶來個人專長的某種整合。我要求管理工作,為的是從製片過程中獲取經驗,以便提供實際有用的工具。身為一個 C++ 編譯器撰寫者,我一直都是自己最主要的用戶之一。而你知道,當你是自己軟體的主力抱怨者時,你就很難再為自己辯護或覺得受到不公平的責難。

狂想曲兩千(Fantasia 2000)片中有一段火鳥(Firebird)特效鏡頭。其電腦特效指導對於我的加盟頗感興趣。不過,為了掂掂我的斤兩,他要求我先寫個工具,讀入為某段場景所攝的原始資料,再由此產生可嵌入 Houdini 動畫套件中的攝影機節點(camera node)。我當然用 C++ 順利把它搞定。他們愛死它了,我也因此得到了我夢寐以求的工作。

有一次,在製片過程中(在此特別感謝 Jinko 和 Chyuan),我被要求以 Perl 重寫那個工具。其它的 TDs 並非編程高手,僅僅知道 Perl、Tcl 之類的程式語言。(TD 是電影工業中的術語,指的是技術導演。我是這部片子的軟體 TD,我們還有一位燈光 TD [嗨 Mira],一位模型 TD [嗨 Tim],以及電影特效動畫師 [嗨 Mike, Steve, Tonya]。)而且,喔,天啊,我得趕著點,因為我們想要獲得一些觀念上的實證,而導演(嗨 Paul 和 Gaetan)及特效總監(嗨 Dave)正等著這個結果,準備呈給公司大頭目(嗨 Peter)。這雖然不是什麼緊急要務,可是,你知道的…,唉。

這令我感到些許為難。我可以自信滿滿地以 C++ 快速完成,但我不懂 Perl。好吧,我想,我去找本書抱抱佛腳好了 - 前提是這本書不能太厚,起碼此刻不能太厚。而且它最好不要告訴我太多東西,雖然我知道我應該知道每一樣東西,不過暫且等等吧。畢竟這只是一場表演:導演們需要一些經過證實的概念,藝術家需要一些東西協助證實其概念,而製片(嗨 heck),她需要的是一天 48 小時。此刻我不需要全世界最棒的 Perl 大全,我需要的是一本能妥善引導我前進,並使我不致偏離正軌過遠的小書。

我找到了 Randal Schwartz 的 Learning Perl,它讓我立即上手並進展神速,而且頗具閱讀趣味。不過,就像其它有趣的電腦書籍一樣,它也略去了不少值得一讀的內容 - 雖然在那個時間點,我並不需要瞭解所有內容,我只需要讓我的 Perl 程式乖乖動起來。

我終於在感傷的心境中明白,C++ Primer 第三版其實無法扮演人們在初學 C++ 時的導師角色。它太龐大了。當然我還是認為它是一本讓我驕傲的巨著 - 特別是由於邀請到 Josee Lajoie 共同完成。但是,對於想立刻學會 C++ 程式語言的人來說,這本巨著實在過於龐大複雜。這正是我動手撰寫Essential C++ 的原因。

你或許會想,C++ 又不是 Perl。完全正確!本書也非 Learning Perl,它談的是如何學習 C++。真正的問題在於,誰能夠在散盡千頁篇幅之後,猶敢自稱教導了所有的東西呢?

1. 精細度。在電腦繪圖領域中,精細度指的是影像被描繪出來的鮮明程度。畫面左上角那位騎在馬背上的匈奴人,需要一張看得清楚眼睛的臉、頭髮、五點鐘方向的影子、衣服…。匈奴人的背後 - 不,不是那塊岩石,老天 - 唔,相較之下無關緊要。因此我們不會以相同的精細度來描繪這兩個影像。同樣道理,本書的精細度調降了相當程度。依我看,C++ Primer 除了在運算子多載化(operator overloading)方面的實例討論稍嫌不足之外,可說極其完備了(我敢這麼說是因為 Josee 也有一份功勞)。但儘管如此,C++ Primer 還花了 46 頁篇幅加以討論,並附上範例,而這本書卻僅以 2 頁帶過。

2. 語言核心。當我還是 C++ Report 的編輯時,我常說,雜誌編輯有一半工作花在決定哪些題材應該放入,哪些不要。這句話對本書一樣成立。本書內容環繞在程式設計過程中所發生的一系列問題。我介紹程式語言本身的特性,藉此來為不同的問題提供解決之道。書中並未述及任何一個多重繼承或虛擬繼承可解決的問題,所以我也就完全沒有討論這兩個主題。然而,為了實作一個 iterator class,我必須引入巢狀型別(nested types)。Class 的型別轉換運算子很容易被錯用,解釋起來也很複雜,所以我不打算在書中提到它。諸如此類。我對題材的選擇以及對語言特性的呈現順序,歡迎大家指教批評。這是我的選擇,也是我的職責。

3. 範例的數量。C++ Primer 有數百頁程式碼,鉅細糜遺,其中甚至包括一套物件導向的文本檢索系統,以及近十個左右的完整 classes。雖然本書也有程式碼,但數量遠不及 C++ Primer。為了彌補這項缺憾,我將所有習題解答都置於附錄A。誠如我的編輯 Deborah Lafferty 所言,『如果你想提高教學速度,唾手可得的解答對於學習的強化,極有助益。』

本書的結構與組織

本書由七章和兩份附錄構成。第一章藉著撰寫一個具有互動性質的小程式,描繪 C++ 語言預先定義的部份。這一章涵蓋了內建的資料型別、語言預先定義好的運算子(operators)、標準程式庫中的 vector 和 string 類別、條件述句和迴圈述句、輸入和輸出用的 iostream 程式庫。我之所以在本章介紹 vector和string兩個 classes,因為我想鼓勵讀者多多利用它們取代語言內建的陣列和C-style 字串。

第二章解釋函式的設計與使用,並針對 C++ 函式的多種不同風貌一一檢視,包括 inline 函式、多載化(overloaded)函式、function template,以及函式指標(pointers to functions)。

第三章涵蓋所謂的 Standard Template Library(STL):一組容器類別(包括 vector, list, set, map 等等)、一組作用於容器身上的泛型演算法(包括 sort(), copy(), merge() 等等)。附錄B依字典順序列出最常被廣泛使用的泛型演算法,並逐一附上使用實例。

身為一個 C++ 程式員,你的主要任務便是提交 classes 以及物件導向的classes 階層體系。第四章帶領你親身走訪 classes 機制的設計與使用過程。在這個過程中,你會看到如何為自身的應用系統建立起專屬的資料型別。第五章說明如何擴展 classes,使多個相關的 classes 形成族系,支援物件導向的 classes 階層體系。以我在夢工廠動畫電影公司(Dreamworks Animation)擔任顧問的經驗為例,那時候我們設計了一些 classes,用來進行四個頻道影像合成之類的工作。我們使用繼承和動態繫結(dynamic binding)技術,定義影像合成所需的 classes 階層體系,而不只是設計八個相互獨立的 classes。

第六章的重頭戲是 class templates,那是建立 class 時的一種先行描述,讓我們得以將 class 用到的一個(或多個)資料型別或資料值,抽離並參數化。以 vector 為例,可能需要將其元素的型別加以參數化。buffer 的設計不僅得將元素型別參數化,亦得將其緩衝區容量參數化。本章的行進路線圍繞在二元樹(binary tree)class template 實作上。

最後一章,第七章,說明如何使用 C++ 提供的異常處理機制(exception handling facility),並示範如何將它融入標準程式庫所定義的異常體系中。附錄A是本書習題解答。附錄B 提供最被廣泛運用的一些泛型演算法的相關討論與使用實例。
關於原始碼

本書的所有程式,以及習題解答中的完整程式碼,皆可線上取得。你可以在 Addison Wesley Longman 的網站(www.awl.com/cseng/titles/0-201-48518-4)或我的個人首頁(www.objectwrite.com)中取得。所有程式皆在 Visual C++ 5.0 環境中以 Intel C++ 編譯器測試過,並且也在 Visual C++ 6.0 環境中以 Microsoft C++ 編譯器測試過。你或許需要稍微修改程式碼,才能在自己的系統上編譯成功。如果你需要做任何修改並且也做了,請將修改結果寄一份給我(slippman@objectwrite.com),我會將它們附上你的大名,附於習題解答程式碼中。注意,本書並未顯示所有程式碼。

致謝

在這裡我要特別感謝 C++ Primer 第三版的共同作者 Josee Lajoie。不僅因為她為本書初稿提供了許多深入見解,更因為她在背後不斷地帶給我鼓舞。我也要特別感謝 Dave Slayton 以他那犀利的綠色鉛筆,徹底檢視了文本內容與程式範例。Steve Vinoski 則以同情但堅決的口吻,為本書初稿提供了許多寶貴意見。

特別感謝 Addison-Wesley 編輯小組:Deborah Lafferty,本書編輯,從頭到尾支援這個案子;Besty Hardinger,審稿編輯,對本書文字的可讀性貢獻最大。John Fuller,產品經理,帶領我們把一堆文稿化為一本完整的書冊。

撰寫本書的過程中,我同時還擔任獨立顧問工作,必須兼顧 Essential C++ 和客戶之間的事務。感謝我的客戶對我如此地體諒和寬容。我要感謝 Colin Lipworth, Edwin Leonard, Kenneth Meyer,因為你們的耐心與信賴,本書才得以完成。

更多資訊

內舉不避親,我要推薦 C++ 書籍中最好的兩本,那便是 Lippman 與 Lajoie 合著的 C++ Primer,以及 Stroustrup 著的 The C++ Programming Language。兩書目前皆為第三版。我會在本書各主題內提供其他更深入的參考書目。以下便是本書的參考書目。(你可以在 C++ Primer 和 The C++ Programming Language找到更廣泛的參考文獻

[LIPPMAN98] Lippman, Stanley and Josee Lajoie, C++ Primer, 3rd Editoin, Addison Wesley Longman, Inc., Reading, MA (1998) ISBN 0-201-82470-1.

[LIPPMAN96a] Lippman, Stanley, Inside the C++ Object Model, Addison Wesley Longman, Inc., Reading, MA (1996) ISBN 0-201-83454-5.

[LIPPMAN96b] Lippman, Stanley, Editor, C++ Gems, a SIGS Books imprint, Cambridge University Press, Cambridge, England (1996) ISBN 0-13570581-9.

[STROUSTRUP97] Stroustrup, Bjarne, The C++ Programming Language, 3rd Editoin, Addison Wesley Longman, Inc., Reading, MA (1997) ISBN 0-201-88954-4.

[SUTTER99] Sutter, Herb, Exceptional C++, Addison Wesley Longman, Inc., Reading, MA (2000) ISBN 0-201-61562-2.

字形習慣(英文版)

本書文字字型為 10.5 pt Palatino。程式碼和語言關鍵字為 8.5 pt lucida。書中出現的識別字如果後面緊接著 C++ 的 function call 運算子(也就是一對小括號 ()),即代表某個函式名稱。因此,foo 代表程式中的某個物件,bar() 代表程式中的函式。各個 classes 的名稱以 Palatino 字形呈現。

譯註:繁體中文版的排版方式是:內文中的一般英文字為 9 pt Times New Roman。程式碼和語言關鍵字為 8 pt Courier New。各個 classes 的名稱亦為 8 pt Courier New。異常類別(exception classes)以 8 pt Lucida Sans 呈現。英文長術語(例如 template parameter list, by reference, exception safe)採用 8 pt Arial。運算子名稱採用 9 pt Footlight MT Light。

 


目錄

本書繁體版目錄請見 目錄 (PDF)

封底

本書繁體版封底請見 封底文案 (PDF)