關於C++要讀的幾本書

1. The C++ Programming Language

2.Effective C++

3.Design Patterns

4.International Standard for C++

5.Modern C++ Design

五本最重要的C++圖書
爲了讓這個名單(也包括後續文章中提到的其他名單)更有價值,我給自己定了兩條原則。第一,只挑五本。哪怕多一本,讓它共享這份榮譽的位子也沒有,也沒有爲那些差不多靠邊者準備優秀獎。五個位子,五本書。第二,我沒有將自己的書排除在競爭行列之外。如果我要評判別人的書,當然也不能放過自己的。
    這兩個原則已經相當公平而嚴格了,因此我在其他方面就可以偷點懶:我不打算對名單上的圖書按重要性從高到低排座次(其他幾個名單也一樣)。我的評判粒度是“在名單上”和“不在名單上”。每個名單裏,我都以年代爲序,本文的單子裏,自然就是出版日期。
    言歸正傳,下面揭曉我評選的過去出版的最重要的五本C++圖書:
The C++ Programming Language,作者Bjarne StroustrupAddison-Wesley出版社。1986年首版,1991年再版,1997年第三版,2000年特別版。對於C++老人們來說,此書的首版是打開知識大門的鑰匙。目前的版本已經膨脹到千頁以上,增加了很多那時候還不存在的特性,如模板、異常、多繼承等,不過未提及標準模板庫;顯然首版——也是我逐頁閱讀過的唯一版本——更易馴服,只有328頁。身處80年代後半頁的C++程序員,對這本書的完全旅行是必不可少的,它對早期的C++從業者和追夢人的重要影響,怎麼評價都不過分。即使介紹C++的圖書滿天飛的現在,我仍然推薦專業開發人員閱讀這本書(當前版本),因爲我認爲無論就C++本身,還是如何用好C++來說,它都是最全面的參考書。
Stroustrup因爲吝於詞句的寫作風格而遭詬病,大家都知道我說過,如果閱讀TC++PL(譯者注:即The C++ Programming Language的簡稱。此書行文簡潔)時,你無意忽略了哪怕一個句子,就有可能丟掉了很重要的東西(再想想目前版本千頁以上的篇幅,你就能明白我爲什麼說它是最全面的參考書了)。然而,精煉恰是這本書無與倫比的魅力之一。比如,首版中對自賦值處理方法的說明,就再好不過證明了這一點:
if (this == &a) return;           // beware of s=s;
 
首版《Effective C++》裏,我在同樣問題上花費了了五頁半的篇幅。你不得不爲這樣一本半行註釋就解決問題的圖書傾倒。
Effective C++》,作者Scott MeyersAddison-Wesley出版社。1992年首版,1998年再版,2005年第三版。它是超級天才的傑作!哦,不要吐,別在意。
我和此書都很幸運,它生逢其時。1991年前後,大部分程序員已經掌握了語言基礎,能做到根據需求編寫C++程序,但同時總覺得自己無法避免看似可以避免的諸多問題。這是業界第一本專注於如何深入使用C++,全力幫助開發者解決常見問題,最好地使用非C特性(如構造器、析構器、繼承、虛函數和類內存分配器等)的圖書。在這本書裏,一反常態,不像當時大多數人將重點放在討論C++的靈活性上,我採用了一種很特別的指導式思路來寫作。以我的經驗判斷,我認爲程序員渴望找到強能有力的辦法來控制C++的靈活多變,因此我要告訴他們究竟該做什麼。這本書做到了。“一定要這麼做”,“千萬不要那樣幹”。一代程序員將這些原則熟記於心,也催生了不少協助性工具。比如Gnu C++編譯器,甚至設置了《Effective C++》指導原則的檢測警告選項[1]。此書的一個重要特點——直到寫作我的第二本書(《More Effective C++》)難以爲繼時,我才深入領會到——是其條款內容短小精悍,這樣,讀者坐公交車、火車,等待會議開始,甚至我曾經說過的坐在馬桶上時都可以閱讀這本書。
Design Patterns,作者Erich GammaRichard HelmRalph JohnsonJohn VlissidesAddison-Wesley出版社,1995年。它本身不是一本針對C++的書,但它對使用C++以及其他任何面向對象編程語言進行良好設計都產生了深遠影響。此書在專業軟件開發人員中發起了模式啓蒙運動,而且提出了一系列至今仍居常用模式詞彙表核心地位的設計模式[2]。如果你熟悉命令(Command)、訪問者(Visitor)、裝飾(Decorator)或單例(單態,Singleton)等模式——甚至已經深入掌握了設計模式,那麼基本上可以肯定你讀過這本書,我們應該感謝它。
此書中提到的模式,至今仍是C++技術界的熱門話題。例如Herb Sutter20039月,在其C/C++ Users Journal專欄提出了觀察者(Observer)模式新的實現方法,Andrei Alexandrescu也分別於20054月和6月,在其C/C++ Users Journal專欄對這個模式做過討論。
International Standard for C++ISO/IEC1998年首版,2003年第二版。標準類資料讀起來枯燥乏味,但必須有這樣的東西去定義什麼是C++,什麼不是C++,這本書就擔此重任。在這以前,若想知道C++的正確實現,最好要讀Margaret EllisBjarne Stroustrup合著的《The Annotated C++ Reference Manual》(即著名的ARMAddison-Wesley1990年版),並用不同的編譯器檢查代碼,得想方設法理解Bjarne Stroustrup的意思(如通過讀他的書)。1998年版的C++標準不能回答所有問題(任何資料都做不到),比如,vector的內存佈局必須與C數組兼容嗎?[3]但它仍不失爲一本C++權威參考書,無論是爲編程實現還是語言使用者,都在標準化上做出了巨大努力。2003年出的第二版,實際上是一個Bug修復更新版,更像是1.1而不是2.0版本,但它也是一個語言官方規範修訂本。
Modern C++ Design,作者Andrei AlexandrescuAddison-Wesley2001年版。設計模板的初衷是實現類型的容器(“containers of T”),但它能做的遠不僅僅這點。實際上,在Alexandrescu的書出現之前,1998C++標準的STL部分要求的模板實現就遠遠超出“類型的容器”。但《Modern C++ Design》的出現,才真正爲C++技術界打破了模板的牢籠。此書影響深遠,堪稱新舊兩代C++程序設計的分水嶺;此後,“modern C++”一般都被用來專指採用了因此書而普及的模板技術的代碼。通過Google搜索包含“modern C++”的新聞組帖子,19852000年共有662個結果,而從2001年到現在,則有3200個。
儘管無關於這本書在C++歷史上的重要性,但我想有一點仍然值得提及,那就是在Alexandrescu寫這本書的時候,他還找不到一個支持這本書的代碼包含的所有C++標準的編譯器!
當你再次瀏覽這個名單的時候,請記得我是Addison-Wesley的簽約作家,這個身份使我有機會免費獲得Addison-Wesley出版的任何優秀圖書。因此,可能相對於其他出版社來說,我更熟悉的是Addison-Wesley的圖書。不過,如果其他出版社有圖書震撼了C++世界,我想我肯定也會聽說過。
在本系列的下一篇文章裏,我將選擇C++歷史上最重要的非圖書出版物(如雜誌的文章等)。
 
1
即:-Weffc++
2
一直以來,我都有意在Google上搜索網頁和新聞組最常提及的模式名,結果我發現多年來,20個最頻繁提及的模式名,絕大部分出自這本書。這充分證明這本10年高齡的圖書經久不衰。
3
是的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章