天天看點

C++經典書籍推薦,附詳細介紹

      C++是一門廣泛用于工業軟體研發的大型語言。它自身的複雜性和解決現實問題的能力,使其極具學術研究價值和工業價值。和C語言一樣,C++已經在許多重要的領域大獲成功。

      然而,一個不可否認的現實是,在低階程式設計領域,C++擠壓着C同時也在承受着C的強烈反彈,而在高階程式設計領域,Java和C#正在不斷蠶食着C+   +的地盤。也許C++與C合為一體永遠都是一個夢想,也許Java和C#的狂潮終将迫使C++回歸本位   —   回到它有着根本性優勢的開發領域:低級系統程式設計、進階大規模高性能應用設計、嵌入式程式設計以及數值科學計算等。果真如此,我認為這未嘗不是一件好事。

    C++吸引如此之多的智力投入,以至于這個領域的優秀作品,包括重量級的軟體産品、程式庫以及書籍等,數不勝數。文題“C++程式設計之四書五經”一個不太嚴格的含義是:C++程式設計之四書   ⅹ   五經。是的,在本文(及其下篇)中,我将分門别類推薦20多本C++好書,你可以根據自己的需要選讀。

TCPL和D&E

TCPL和D&E分别是 《The   C++   Programming   Language》和 《The   Design   and   Evolution   of   C++》的簡稱,均出自Bjarne   Stroustrup之手。我将它們單列出來,首先是因為Bjarne是C++語言的建立者,然後是因為比“首先”那個原因更重要的原因:這兩本書是C+   +領域毋庸置疑的傑作。說它們是C++語言聖經,并不為過。

Bjarne   Stroustrup,   The   C++   Programming   Language   (Special   3rd   Edition)

《C++程式設計語言(特别版)》,機械工業出版社

《C++程式設計語言(特别版)(英文影印版)》,高等教育出版社

迄今為止,TCPL是除了C++标準文獻之外最權威的C++參考手冊。和大多數人的看法不大一樣,我認為Bjarne的文字語言并不遜色于他所建立的程式語言,至少我喜歡這種學院氣息濃厚的作品。本書對C++語言的描述輪廓鮮明、直截了當。它從C++語言建立者的角度來觀察C++,這是任何别的作者和書籍做不到的   —   沒有任何人比Bjarne自己更清楚該怎麼來使用C++。

這是一本嚴肅的著作,以中、進階C++開發人員為目标讀者。如果你是一名有經驗的C++程式員,需要了解更加本質的C++知識,本書正是為你而寫。它不是那種讓你看了會不斷竊喜的小書,需要用心體會,反複咀嚼。在閱讀過程中,請特别留心Bjarne先生強調了什麼,又對什麼一語帶過。我個人比較喜歡這本書的第四部分“使用C++做設計”,這樣的内容在類似的程式設計語言書籍中很難看到   —   我甚至認為Bjarne應該将這部分獨立出來單獨寫一本書。

 

Bjarne   Stroustrup,   The   Design   and   Evolution   of   C++

《C++語言的設計和演化》,機械工業出版社

《C++語言的設計和演化(英文版)》,機械工業出版社

D&E是一本關于C++語言設計原理、設計決策和設計哲學的專著。它清晰地回答了C++為什麼會成為今天這個樣子而沒有變成另外一種語言。作為C   ++語言的建立者,Bjarne淋漓盡緻地展示了他獨到而深刻的見解。除了廣受贊譽的語言特性外,Bjarne沒有回避那些引起争議的甚至被拒絕的C++   特性,他一一給出了邏輯嚴密、令人信服的解釋。内容涵蓋C++的史前時代、帶類的C、C++的設計規則、标準化、庫、記憶體管理、多重繼承、模闆等,對包括異常機制、運作時類型資訊和名字空間在内的重要的新特性都分别進行了深入探讨。每一名C++程式員都應該可以從Bjarne的闡釋中加深對手中這門語言的認識。

需要再次提醒的是,這兩本書知識濃縮,資訊量極大,請不要錯過Bjarne每一句看似漫不經意的話。

入門教程

學習任何一門語言都需要一個從入門到精通、從新手到高手循序漸進的過程。不過,對于一個所謂的新手而言,究竟是一個完完全全的新手,還是一個熟悉某種别的語言的“新手”,甚至是在某種語言程式設計領域已經頗有建樹的高手,很難一概而論?不同的C++新手需要不同的入門書籍。

Andrew   Koenig,   Barbara   E.   Moo,   Accelerated   C++:   Practical   Programming   by   Example

《Accelerated   C++中文版》,中國電力出版社

和市面上大多數C++教程不同,本書不是從“C++中的C”開始講解,而是始于道地的C++特性。從一開始就使用标準庫來寫程式,随着講述的逐漸深入,又一一解釋這些标準庫元件所依賴的基礎概念。另外,和其他C++教材不同的是,這本書以執行個體拉動語言和标準庫的講解,對後兩者的講解是為了給執行個體程式提供支援,而不是像絕大多數C++教材那樣,例子隻是用作示範語言特性和标準庫用法的輔助工具。

作者在C++領域的程式設計實踐、教育教育訓練以及技術寫作方面都是世界一流水準。我喜歡這種大量使用标準庫和C++語言原生特性的清新的寫作風格。在這本教材面前,幾乎迄今為止的所有C++教材都黯然失色或顯得過時。盡管這本教材也許對于國内的高校教育來說有些前衛,不過我仍然極力向我的同行們推薦。順帶一提,在Bjarne和我最近的一封通信裡,他這樣評價本書:對于有經驗的程式員學習C++而言,這本書可能是世界上最好的一本。

Stanley   B.Lippman,   Josee   Lajoie,   C++   Primer   (3rd   Edition)

《C++   Primer   (3RD)中文版》,中國電力出版社

這本書的名字多少有點讓人誤解。盡管作者聲稱這本書是為C++新手而寫,但無論是它的厚度還是講解的深度都暴露了似乎并非如此。也許說它是一本“從入門到精通”的C++教程會更合适一些。我個人認為它并不适合完全不懂C++的初學者   —   在閱讀這本書之前,你至少應該先有那麼一點C或C++的背景知識,或者至少要具有一些其他語言的程式設計經驗。

盡管這本書省略了一些進階C++特性的讨論,但仍然可以稱得上是迄今為止最全面的C++學習教程。事實上,如果一名C++初學者能夠紮紮實實地讀完本書并對照 《C++   Primer   Answer   Book》完成全部習題的話,他的水準肯定可以進入職業C++程式員的行列。我個人認為,即使你已經擁有了TCPL,這本書依然有擁有的價值,因為在許多方面它比TCPL來得更詳細、更易懂。

Stanley   B.   Lippman,   Essential   C++

《Essential   C++中文版》,華中科技大學出版社

《Essential   C++(影印版)》,中國電力出版社

可以不太嚴格地認為這本書是《C++   Primer》的精簡版。本書一一講述了C++中最具代表性的主題,包括過程式程式設計、泛型程式設計、基于對象程式設計、面向對象程式設計、模闆程式設計以及異常處理等。   Stanley将門檻調低到“具有其他語言程式設計經驗”的C++新手所能接受的最基本的層次,使他們能夠迅速開始使用C++程式設計而又免于閱讀《C++   Primer》那樣的大部頭。它以執行個體引導學習,力圖使讀者在最短的時間内把握C++的精粹。

也許換一個人來概述C++程式設計範型(paradigm)的方方面面需要好幾百頁才能說清楚,但這本小書不可思議地做到了這一點。我個人非常喜歡這種滿是技術、簡明扼要并且“有話好好說”的書。這本書同樣具有一個明顯的風格:所有程式例子全部采用标準庫元件,讓人耳目一新。

以上三本書都不是為了完完全全的程式設計新手而寫。完全的C++程式設計新手可以閱讀Francis   Glassborow的新書(尚未出版):《You   Can   Do   It!:   A   Beginner's   Introduction   to   Computer   Programming》。這也是Bjarne的推薦。Francis   Glassborow是ACCU主席,多年來他對幾乎每一本C++經典名著評頭論足,他自己的這一本自然會引起C++社群的極大興趣。

高效、健壯程式設計

兩年前我在負責一個省級電力排程系統項目時編寫了一個網關程式,它從SCADA系統擷取電力實時資訊。通訊接口采用了不常用的資料庫直連方式(這個網關程式一端連接配接SQL   Server   6.5,另一端連接配接Oralce   8.1.6)。由于實時測點近萬,每次将全部取樣更新或插入一遍顯然是低效的。我在網關程式裡建了一個記憶體庫,擷取到的資料首先在其中進行比較,然後決定是否更新實體資料庫(同時還做了别的更複雜的事情……),進而在效率和資源占用兩方面達到了預期效果。

這個程式一直運作得很好,但在離開現場之後的某一天,系統管理者打來電話,說大概因為網絡故障等原因,有時這個網關程式會崩潰掉   —   它自己崩掉也就罷了,問題是它還會把Windows   2000   Advanced   Server搞成“藍屏”!坦白地說,我還從來沒看過哪個非蓄意的程式有這個“能耐”。由于當時正忙于另外一個大項目,無法去現場調試,最後隻有憑經驗對記憶體庫代碼小心翼翼地封裝以異常處理代碼(同時也做了一些别的修改……)。這樣,雖然沒有徹底解決問題,但程式終究不再死得那麼難看了。

在這兒講這麼一段花絮有什麼意思呢(當初為那個可怕的bug朝思暮想時我可不認為這是一個“花絮”)?我想說的是,對于任何軟體而言,離開強健,效率也就無從談起。而對于C++程式員來說,也許編寫一個高效的程式并不難,但要編寫一個需要7   ⅹ   24小時持續運作的服務端軟體就不是那麼容易了,需要考慮許多因素,有時這些因素甚至遠遠超出C++語言和開發工具的本身。作為一名開發實際項目軟體的程式員,并非非得自己碰釘子才能積累經驗,隻要我們足夠虛心,别人的經驗往往都是我們很好的借鑒。鑒于此,我推薦以下幾本書供你選讀,它們可以讓你從強健和效率兩方面受益(當然了,它們涵蓋的内容遠不限于異常處理J)。

Scott   Meyers,   Effective   C++:   50   Specific   Ways   to   Improve   Your   Programs   and   Design   (2nd   Edition)

Scott   Meyers,   More   Effective   C++:   35   New   Ways   to   Improve   Your   Programs   and   Designs

《Effective   C++中文版》,華中科技大學出版社

《More   Effective   C++中文版》,中國電力出版社

《Effective   C++(影印版)》,中國電力出版社

如果說《Effective   C++》主要讨論C++中一些相對基礎的概念和技巧的話,那麼《More   Effective   C++》則着重探讨了包括異常處理在内的一系列進階技術。與前者相比,後者具有兩大主要差別:其一,它包含很多時新的标準C++的内容;第二,它讨論的主題傾向于“戰略化”而非“戰術化”,并且讨論得更深入、更徹底。尤其是對虛析構函數、智能指針、引用計數以及代理類(proxy   classe)等技術和模式論述的深入程度,讓人很難想象是出現于這樣的一本小書之中。

遊刃有餘的技術,高超的寫作技巧,Scott無疑是世界上最優秀的C++技術作家之一。在簡潔、清晰、易讀等方面,這兩本書都卓爾不群。總之,Scott   提供的這85個可以改善程式設計技術和設計思維的方法,都是中、進階C++程式員必備的技能。我強烈推薦這兩本書(實際上還有一本,稍後就會看到)。

Herb   Sutter,   Exceptional   C++:   47   Engineering   Puzzles,   Programming   Problems,   and   Solutions

Herb   Sutter,   More   Exceptional   C++:   40   New   Engineering   Puzzles,   Programming   Problems,   and   Solutions

《Exceptional   C++中文版》,中國電力出版社

《More   Exceptional   C++中文版》,華中科技大學出版社

你自認為是一名C++語言專家嗎?讀一讀ISO   C++标準委員會秘書長的這兩本書再回答。在這兩本書中,Herb采用了“問答”的方式指導你學習C++語言特性。對于每一個專題,Herb首先合理地設想出你的疑問和困惑,接着又猜測出你十有八九是錯誤的解答,然後給你以指點并提出最佳解決方案,最後還歸納出解決類似問題的普适性原則。

這兩本書是典型的深究C++語言細節的著作,很薄,但内容密集,遠遠超過Scott的那兩本書,讀起來很費腦筋   —   我個人認為它們要比Scott的書難懂得多。若要研習這薄薄的兩本書所包含的知識,至少需要花費數月的時間!(在Scott的薦序中,他坦陳不止一次陷入   GotW問題的陷阱,你應該知道這意味着什麼)對于語言細節的深究有什麼好處呢?盡管在大多數情況下,我們不必關心C++代碼幕後的動作,然而當我們不得不關心時,這兩本書可以為我們提供很好的線索,因為它們揭示了C++語言中微妙而又至關重要的東西。

Stephen   C.   Dewhurst,   C++   Gotchas:   Avoiding   Common   Problems   in   Coding   and   Design

《C++程式設計陷阱》,中國青年出版社

Stephen的理論素養和實踐經驗注定這是一本值得一讀的好書。Stephen曾經是貝爾實驗室中第一批C++使用者。他已經使用C++成功解決了包括編譯器、證券交易、電子商務以及嵌入式系統等領域中的問題。本書彙集了作者來自開發一線的99條程式設計真知灼見,洞悉它們,你可以避免幾乎所有常見的C++   設計和程式設計問題。

我甚至認為,對于C++程式設計菜鳥而言,閱讀這本書會比閱讀Scott和Herb的書更能輕松而立竿見影地獲得更大的提高。我個人很喜歡這本書的寫作風格   —   Stephen的許多觀點看似極端卻無可辯駁。當然了,這種自信(以及冷幽默)來自于作者深厚的技術素養,而非自大的偏執。

除了上面推薦的書籍外,Dov   Bulka和   David   Mayhew合著的《Efficient   C++:   Performance   Programming   Techniques》(《提高C++性能的程式設計技術》,清華大學出版社)也值得一看。這本超薄小書聚焦于高性能C++應用程式開發。兩位作者都是IBM   軟體專家,都工作于對性能要求極高的系統建構領域,本書是他們的經驗之談。也有人不喜歡這本書,因為它花了不少的篇幅講述和C++無關的東西,我卻恰恰因為這一點而對這本書産生好感,正是這些東西讓我開闊了眼界。

模闆和泛型程式設計

模闆和基于模闆的泛型程式設計無疑是當今發展最活躍的C++程式設計技術。模闆的第一個革命性的應用是STL,它将模闆技術在泛型容器和算法領域的運用展現得淋漓盡緻,而Boost、Loki等現代程式庫則将模闆技術的潛能不斷發揮到極緻。在模闆和泛型程式設計領域,我推薦以下兩本重量級著作:

David   Vandevoorde,   Nicolai   M.   Josuttis,   C++   Templates:   The   Complete   Guide

《C++   Templates全覽(繁體版)》,台灣碁峰資訊股份有限公司

《C++   Templates全覽(簡體版)》,人民郵電出版社

有一種老套的贊美一本書的手法,大緻是“沒有看過這本書,你就怎麼怎麼地”,這裡面往往誇張的成分居多。不過,倘若說“沒有看過 《C++   Templates:   The   Complete   Guide》,你就不可能精通C++模闆程式設計”,那麼這個論斷對于世界上絕大多數C++程式員來說是成立的。

這本書填補了C++模闆書籍領域由來已久的空白。此前,上有 《Modern   C++   Design》這樣的專注于模闆進階程式設計技術和泛型模式的著作,下有 《The   C++   Standard   Library》這樣的針對特定模闆架構群組件的使用指南。然而,假如對模闆機制缺乏深入的了解,你就很難“上下”自如。鑒于此,我向每一位渴望透徹了解   C++模闆技術的朋友推薦這本書。

這本書在内地、台灣各有一個譯本,但出自不同的譯者之手。當你看到這篇文章時,兩個譯本應該都已經上市,對于讀者來說當然也就多了一種選擇。侯捷先生個人網站上開放了繁體譯本大部分章節,不妨先睹為快。

Andrei   Alexandrescu,   Modern   C++   Design:   Generic   Programming   and   Design   Patterns   Applied

《C++設計新思維:泛型程式設計與設計模式之應用》,華中科技大學出版社

《C++設計新思維(影印版)》,中國電力出版社

你自認為是C++模闆程式設計高手嗎?請看過這本書再回答J   這是一本出自天才之手令人敬畏的傑作。泛型模式,無限延伸你的視野,足以挑戰任何一名C++程式員的思維極限。

這本書共分為兩大部分,第一部分讨論了   Loki程式庫采用的基礎技術以及一些進階語言特性,包括基于政策的類設計、模闆局部特化、編譯期斷言、Typelist以及小型對象配置設定技術等。第二部分則着重介紹了Loki中的重要元件和泛型模式技術,包括泛化仿函數(Generalization   Functor)、單件(Singleton)、智能指針、對象工廠(Object   Factory)、抽象工廠(Abstract   Factory)、通路者(Visitor)以及多方法(Multimethods)等。每一種技術都讓人大開眼界,歎為觀止。

在C++的學習方面,過猶不及往往成了不求甚解的借口。然而,面向對象并非C++的全部,模闆和泛型程式設計亦占半壁江山。對于“嚴肅”的C++程式員而言,及時跟進這項早經例證的成功技術,不失為明智之舉。