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++程序員而言,及時跟進這項早經例證的成功技術,不失爲明智之舉。

結語

這些著做是如此大名鼎鼎,也許根本不缺我一個推薦。然而,縱然C++程序員隊伍的發展壯大速度不像其餘更時髦的語言那樣迅速,新人進老是多於舊人出。除了熱忱地歡迎新人,我我的認爲到了對C++書籍進行「盤點」的時候了,而且但願這樣的「盤點」有益於感興趣的讀者。請保持耐心和寬厚。在下篇中,我將繼續介紹標準庫、網絡編程以及其餘方面的C++好書。
                                                                                   轉自:http://blog.renren.com/blog/237327356/408912988程序員

相關文章
相關標籤/搜索