搜尋此網誌

工商服務

2009年1月15日 星期四

《C++ Primer 4/e中文版》讀書心得

作者:侯捷
出版社:碁峰
出版日期:2008年01月24日
語言:繁體中文
ISBN:9789861546698
裝訂:平裝
定價:990元(79折782元)


我「曾經」是C++的狂熱追隨者,是因為那是我入門的物件導向語言(Delphi當然也是,但是因為其IDE和VCL實在是太方便了,三兩下就把程式兜完,況且程式規模都很小,總之以往在寫的時候物件導向概念用得並不多;PS:但是聲明一下,那可不代表我不會寫Object Pascal喔),以及大學時期有個好友兼室友推薦我學的,再者,我們都喜歡看侯捷的書,無論是他翻譯或者寫的都幾乎與C++脫不了關係。

前面提到的「曾經」兩字意味深長,打從2005年的碩士論文用過C++及其物件導向能力之後,到公司上班初期用的都是C和DSP組合語言,最近這1年多才又因為使用Qt開發GUI而摸了一點點C++,所以C++的書還有文章好久沒看了,甚至開始生疏,有一天猛然聽聞C++將有新標準C++0x,還嚇了一跳。

補充一下好了,C++0x的後綴兩碼是年份,看來應該會在今年2009年通過,所以到時候會正名為C++09;最早的那一版是在1998年通過的,所以叫做C++98,諸如此類。此外,雖然C++0x導入了許多不錯的機制、概念和改進(至於到底有哪些新功能呢?我也還沒有仔細研究,請自行參考Wikipedia上的C++0x解釋吧),但是會與舊版的C++98百分之百相容,所以之前投資的學習時間也沒有浪費,只是需要再多付出點心力在新功能上面就是了。目前已經部分支援C++0x的編譯器有GCCC++Builder等。

總之我又燃起了對C++的求知慾望,便向公司圖書館借閱了《C++ Primer》的最新第四版。從前我們都是看《C++ Primer》學習C++的,但實際上這種大部頭(簡單講就是「厚」啦,不過通常也意味著「夠全面性」;第三版1238頁,第四版則簡化至885頁)的書是不可能輕易逐頁逐句看完的,因為基本上它的角色算是參考書,大部分時間可能都是放在書架上的,需要時再針對某個章節細讀即可(例如這次我看了第15章有關物件導向概論的那個部分)。所以入門看的是該作者將這本書精簡過後的《Essential C++》,但是現在《C++ Primer》第四版好像沒有出對應的版本捏,大概是作者已經把Essential的精要精神體現在《C++ Primer》第四版的某些章節裡面了吧,難怪章節和排版上都有了些非常正面的微妙變化,連頁數都貼心地減少了28%,減輕捧讀的重量,呵。

侯捷近來似乎都活躍於大陸居多,他的官網好久以前就連不上去了,相關的出版訊息也很少聽聞了,連新版的《Thinking in Java》都改由王建興獨挑大樑和別人合力完成了。總之侯捷實在太過忙碌了,因此這本書採行的是他後來慣用的合譯模式,此次是由1個台灣學生和2個大陸學生完成初(粗)稿,最後再由他字字斟酌為全部書稿定案。

但是必須留意的是這本第四版的原著在2005年就出版了,所以並未包含C++0x語言標準的部分,因此此番我的讀書心得目的主要是想要比較該書本身新舊版本之間的內容差異。

首先,一如開頭〈譯序〉所說的,在第三版時侯捷很前瞻地“保留很多業界流通的英文術語不譯”,到了第四版時則“惟若干術語在時代變遷的情況下改用中文”。

在版面編排上,此版加入了許多「圖示框框」,點燃的砲彈提醒讀者當心(beware)、一把鑰匙是提示(tip)、發亮的燈泡是注意(note)、打勾的則是最佳實踐(best practice),就像有老師在耳畔提醒說這裡很重要請劃起來一樣。例如第15章第1節〈物件導向編程概觀〉的「繼承」那個段落裡面提到:“在C++中,bass class必須指出它的哪些函式意圖被其derived classes重新定義。這種函式應該被定義為virtual。”看完之後馬上喚起了我對於類別定義裡面、函式前方出現的「virtual」修飾字的記憶,畢竟這種「繼承並改寫部分函式功能」在物件導向裡面是很常見的,所以到了下兩頁的「Base Class的成員函式」內容時,便出現了一個最佳實務的框框,把這件事又再強調了一遍:“Base class通常應該把「有必要由derived class重新定義」的函式定義為virtual。”

從目錄組織結構來看,似乎教學方式也做了調整,關於這部分在〈前言〉裡面有作者的親自說明。我看書習慣把〈前言〉和〈目錄〉都先掃過一遍,經常會有不錯的收穫,之後讀起書來也會上手得比較快。至於推薦序之類的東西,則少看為妙,因為通常沒啥養分來著。

在〈前言〉裡面,作者提到“由於C++標準庫廣為流傳且容易獲得,使用和學習C++比以前更為高效。本書此次修訂反映了這些新的發展與價值。”換言之,C++標準庫成了此版的主角,而且更早登場(第3章),許多範例也因應重寫。另外跟許多教科書很相像的是,“每一章都以「本章提要」和「本章術語」作結,扼要重述該章最重要的論述。”以供讀者當作個人的檢驗清單,如果有些地方沒看懂,就表示需要翻回前面重讀。

大部分的C++書籍都是先從低階基礎細節開始,接著是進階的語言特性,最後才是C++標準庫。不幸的是讀者往往半途而廢,陷在低階程式設計的泥沼中,而無法發揮物件導向的抽象化程式設計方法。所以本書的這個版本會先從語言基礎特性和標準庫一起開始,讓讀者漸漸有上手的感覺之後,再往進階艱澀議題邁進。想必作者在這部分下了不少苦工,光憑這點,即使已經擁有第三版了,也都還值得再買新的第四版來啃,再度精鍊自己的C++功力。

最後,套具作者自己的話來一言以蔽之:“本書各版至今不曾改變的是,這仍是一本全面性的C++入門導引書。”

連結:Wikipedia上的C++0x解釋
連結:C++0x Language Support in GCC
連結:C++Builder 2009 support for new C++0x standards
工商服務:購買《C++ Primer 4/e中文版》《Thinking in Java 4/e中文版》

【2009.01.20 updated】

多年前在就讀台科大研究所時,曾經聆聽過侯捷的演講(應該是微軟舉辦的全省校園巡迴演講),侯捷老師頗有文人氣息,講話很客氣,而且有條理,感覺如沐春風,就跟他的書一樣讓人enjoy。

【2009.02.04 updated】

在本書侯捷的〈譯序〉最後幾行提到:“初稿很早就交上來,我卻因為事務繁重遲至今日才完成全書。”那個「今日」應該是指文末署名的2007年12月7日,然後出版社是到了2008年1月才出版,至於所謂的「初稿很早就交上來」到底有多早呢?無意中逛到合譯者台大柯向上同學的部落格(唔,他今年還在唸大四,真年輕、真優秀哉;而且算起來是小我7屆左右的彰化高中學弟;我硬是要攀關係,ㄎㄎㄎ),裡頭有篇〈汗牛馬〉提到了這件事,看來是2006年6月就交上去了,苦等一年半之後才在天瓏書店見到完成品的如山真面目(另一篇〈《C++ Primer》4/e 中文版首日狂賣〉提到的)。

再補充一點,微軟的Visual Studio則大概要到2010的那個版本才會加入對C++0x的支援,Visual C++ Team Blog上面陸續有些文章討論,例如這篇

5 則留言:

  1. 侯捷官網也搬到大陸了xD
    http://jjhou.csdn.net/

    回覆刪除
  2. 那個應該是他本來的簡體版網站,而且不知道您有沒有發現,最近更新日期是2005年,所以也是非常舊了,XD。

    回覆刪除
  3. lol , sry 完全沒發現是這樣 :p

    回覆刪除