天天看點

C++書籍

(雖然沒啥價值,但是轉載請标明作者和出處)

歡迎關注我的個人網站《程式員網》 

->https://www.itmangoto.cn/

背景:

        最近面試了幾份C++的工作,被虐出了翔。原因很簡單,自己做C++的時間不短,但是缺乏系統的學習,很多東西都是“知其然不知其是以然”。

就好像我喜歡看知乎,關于各類的問題,都能略知一二,但是往往看到各行各業的大牛的一些精彩回答,就會自慚形愧。離散化的知識體系造就的是一個多面手,知道如何整合資源,如何用最低的成本去解決問題,很多時候甚至會有一種“一夫當關,萬夫莫開”的感覺。

        我曾經試過在一個項目裡,從硬體到軟體、從用戶端到伺服器、從單片機到windows到linux再到Android、從方案設計到軟硬體采購、從前端到背景、從客戶需求分析到設計到編碼、從開發到測試都一手包辦了。這樣的人,在很多小公司任職具有相當大的優勢,拿着一個人的工資,做的是很多個人的活。結果是,自己累到就像一條狗(更可悲的是,拿的工資就隻有半狗)。然後在離職跳槽的過程中,被鄙視得體無完膚,尤其是在大公司的面試裡。有感于此,我打算重新打磨一下的技能。

        我認為自己目前是一個“一”字型的人,很多大公司裡面的人是“1”字型的。我對自己的規劃是,成為一個“十”字型的人才,甚至是一個“卅”字型的人才。但是,這是一條特别艱難的路,而且一不小心就會堕入到萬劫不複的深淵。but,沒有人能夠改變我的想法,我會堅持下去。

正文:

        好吧,下面是C++部落格的開篇。就暫且先總結歸納一下C++的學習方法,列一下書單,以及對接下來的部落格内容做個提綱。

一、C++學習方法

        如果我說,C++是一門難學難精的語言,估計沒有人會反對。這裡所提及到的學習方法和路線,并不全是我個人的看法,很多都是借鑒一些前輩和C++專家的看法,主要的目的是幫助我自己制定學習計劃,也順便記錄下來供其他朋友參考。

        本人有數年的程式設計經驗,從最坑爹的彙編,到面像過程的C語言,到面相對象的C++、Java、C#,到函數式的Lisp都有學習和使用過。C++學習和使用了大概兩三年的時間。除了大學期間的C++課程以外,再也沒有系統的學習和研究過C++。工作以來,斷斷續續的用C++進行過開發,包括在windows上面的Visual C++,Linux上用vim和g++,以及開源的UI庫Qt。中間的學習過程主要是,在使用到相關的知識和技術的時候,查閱書籍和别人的部落格。

    是以,我其實隻能算是一個C++新手,部落格的内容部分涉及一些基礎知識的學習,然後寫一些C++進階與提高的内容。

(1)學習C++的四個層次(引自《C++強大背後》,作者是Milo Yip大牛)

        1.第一層次,C++基礎:挑選一本入門書籍,如《C++ Primer》、《C++大學教程》、或Stroustrup撰寫的經典《C++程式設計語言》或他一年半前的新作《C++程式設計原理與實踐》,而一般C++課程也止于此,另外《C++ 标準程式庫》及《The C++ Standard LibraryExtensions》可供參考;

        2.第二層次,正确高效地使用C++:此層次開始必須自修,閱讀過《(More)Effective C++》《(More)Exceptional C++》、《Effective STL》及《C++程式設計規範》等,才适宜踏入專業C++開發之路;

        3.第三層次,深入了解C++:關于全局問題可讀《深入探索C++對象模型》、《Imperfect C++》、《C++沉思錄》、《STL源碼剖析》,要挑戰智商,可看關于模版及模版元程式設計的書籍如《C++ Templates》、《C++設計新思維》、《C++模版元程式設計》;

       4.第四層次,研究C++:閱讀《C++語言的設計和演化》、《程式設計的本質》(含STL設計背後的數學根基)、C++标準檔案《ISO/IEC 14882:2003》、C++标準委員會的提案書和報告書、關于C++的學術文獻。

        5.Milo Yip的建議:“由于我主要是應用C++,大約隻停留于第二、三個層次。然而,C++隻是軟體開發的一環而已,單憑語言并不能應付業務和工程上的問題。建議讀者不要強求幾年内“徹底學會C++的知識”,到達第二層左右便從工作實戰中汲取經驗,有興趣才慢慢繼續學習更高層次的知識。雖然學習C++有難度,但也是相當有趣且有滿足感的。”

        尤其是對于新手來說C++的内容較多,試圖通過一本教材或者入門書籍進而掌握C++各方面的知識,幾乎是不可能的。比較明智的做法是,先掌握一些基本的知識和比較重點的内容,然後嘗試寫一些比較短的代碼或者小型的項目,在實踐過程中碰到了問題再仔細深入研究。

PS:此外我這裡提及一下劉未鵬的觀點。(至于他是程式裡面的top0.1%還是top1%還是top5%,這裡不作讨論。個人覺得他的看法還是挺實在的)

原文請參考:《你應當如何學習C++(以及程式設計)》

        1.C++語言的細節太多

        2.一些著名的C++書籍在暗示語言細節的重要性和有趣

        3.現代C++庫的開發哲學必須用到一些犄角旮旯的語言細節

        對于廣大的C++程式員呢,以為掌握了更多的語言細節就更牛,但實際卻是那些語言細節十有八九是平時程式設計用都用不到的。C++中衆多的細節雖然在庫設計者手裡面有其用武之地,但普通程式員則根本無需過多關注,尤其是沒有實際動機的關注。一般性的編碼實踐準則,以及基本的程式設計能力和基本功,乃至基本的程式設計理論以及算法設計。才是真正需要花時間掌握的東西。(他稱之為“懶惰原則”,或許這可以安慰一下在C++筆試中被虐的我)

        應該說,劉的看法和本文所提及的C++學習路線其實并不沖突。C++學習路線,主要是給出一條從了解、到掌握、到熟練、到精通、到深入研究C++的思路,而劉的看法是從一個普通的C++語言使用者的角度來提醒初學者不必要過度的深入細節。

(2)C++中接觸到的程式設計範式(引自輪子哥)

1.面向對象(靈活應用virtual繼承+shared_ptr可以達到java/C#的效果)

2.模闆(這裡分兩類,分别為type rich programming和meta programming,差別很大)

3.函數式程式設計(如今有了lambda,配合<algorithm>檔案,簡直無敵了)

4.面向過程

1)當我搞語言設計和編譯器的時候,我總是會傾向于創造各種小DSL來給自己用,用的都是模闆(想想boost的spirit大概就明白我的意思了,雖然我不用它),盡量讓跟我有同樣背景的人一眼能看懂我代碼的意思。

2)當我做我那個GUI庫(www.gaclib.net)的時候,純粹是用OO和IoC那一套。

3)當我寫3D渲染程式的時候,我會變成一個為了性能不惜犧牲可讀性的人。

        如輪子哥所說,未必需要每一種都深入。但是如果經常需要用到C++和使用C++幹活的人來說,起碼要有所了解。

(3)C++的具體應用(引自MiloYip)

        C++并非萬能,我按經驗舉出一些C++的适用時機。

(1)C++适合構造程式中需求較穩定的部分,需求變化較大的部分可使用腳本語言;

(2)程式須盡量發揮硬體的最高性能,且性能瓶頸在于CPU和記憶體;

(3)程式須頻繁地與作業系統或硬體溝通;

(4)程式必須使用C++架構/庫,大部分遊戲引擎(如Unreal/Source)及中間件(如Havok/FMOD),有些C++庫提供其他語言的綁定,但通常原生的API性能最好最新;

(5)項目中某個目标平台隻提供C++編譯器的支援。

        按應用領域來說,C++适用于開發伺服器軟體、桌面應用、遊戲、實時系統、高性能計算、嵌入式系統等。

 歡迎關注我的個人網站《程式員網》 

->https://www.itmangoto.cn/

二、C++書單

        這裡不想讨論譚浩強老師的教材是好是壞。但是想在IT和程式設計領域更進一步,多看外國權威著作甚至英文原版,是必然的選擇。上面的C++學習的四個層次中,已經提及了很多,下面再做一個詳細一點的歸納(引自知乎,作者不詳)。

(1)階段 1

《Essential C++》

這是一本内容不多但很實用的C++入門書籍,強調快速上手與了解C++程式設計。本書主要圍繞一系列逐漸複雜的程式問題,以及用以解決這些問題的語言特性展開講解。你不隻學到C++的函數和結構,也會學習到它們的設計目的和基本原理。

《C++ Primer》

本書對C++基本概念、技術、以及現代C++程式設計風格進行了全面而且權威的闡述,是C++初學者的最佳指南;本書可以幫助你編寫實用的程式,而無需首先精通每個語言細節。對于中進階程式員,本書也是不可或缺的參考書。

(2)階段 2

《Effective C++》和《More effective C++》

作者是Scott Meyers。你應該熟讀它們,并清楚地了解每個項目。該書圍繞55條準則,每一條都介紹了一個可讓你寫出更好的C++程式代碼的方法,并以特别設計過的例子詳加讨論。

《Exceptional C++(C++程式設計剖析)》和《More exceptional C++》

這兩本書中都包含了40個C++程式設計問題,這些問題會讓你磨練自己的技能,最終成為優秀的C++程式員。這些問題是Herb Sutter精心挑選,與ISO/ANSI C++官方标準相一緻,幫助程式員在設計、架構和編碼過程中保持良好的風格,進而使編寫的C++軟體更健壯、更高效。

(3)階段 3

《Inside the C++ object model(深度探索C++對象模型)》

本書專注于C++面向對象程式設計的底層機制,包括結構式語意、臨時性對象的生成、封裝、繼承,以及虛拟——虛拟函數和虛拟繼承,幫助你了解程式的底層實作,以便寫出更高效的代碼。

《The design and evolution of C++(C++語言的設計與演化)》

本書作者也是C++語言的設計者Bjarne Stroustrup,作者在書中綜合性地介紹了C++的發展曆史,C++中各種重要機制的本質意義和設計背景,這些機制的基本用途和使用方法,讨論了C++所适合的應用領域及其未來的發展前景,既沒有忽略關鍵性的詳情,又沒有過多地陷入技術細節。

(4)階段 4

《The C++ standard library(C++标準程式庫)》

這是标準模闆庫字典,你可以在本書中找到STL相關的一切知識。本書焦點放在标準模闆庫、檢查容器、疊代器、函數對象和STL算法上。每一個元素都有深刻的呈現,包括其介紹、設計、運用執行個體、細節解說、陷阱、意想不到的危險,以及相關類别和函數等。

《Effective STL》

這是Scott Meyers的第三本C++專著,也是學習STL最權威的書籍。作者對書中的50個指導方針都作了詳盡的分析,并配以示例。通過這些規則,C++開發者可以最大限度地使用STL。

《Generic programming and the STL(泛型程式設計與STL)》

本書闡述了泛型程式設計的核心理念:concepts(概念)、modeling(模型)和refinement(改善),并為你展示這些觀念如何導出STL的基礎概念:iterators(疊代器)、containers(容器)和function objects(函數對象)。按照本書所述,你可以把STL想象成一個由concepts組成的library,你将學習到STL正式結構并了解其強大的優勢。

(5)階段 5

《Exceptional C++ style》

作者為Herb Sutter。本書同樣提出了40個C++風格相關的問題,對一些至關重要的C++細節和互相關系提出了新的見解,為當今的關鍵C++程式設計技術(如泛型程式設計、STL、異常安全等)提供了新的政策,幫助開發者在開銷與功能之間、優雅與可維護性之間、靈活性與過分靈活之間尋找完美的平衡點。

《C++ template》

這是一本關于C++模闆的完整的參考手冊和教程,它強調模闆的使用實踐,包含了現實世界中的例子。每個C++程式員都應該好好讀一讀這本書。

《Modern C++ design(現代C++設計)》

作者Andrei Alexandrescu為C++程式員打開了一個新的局面。本書提供了一些針對軟體設計的前沿方法,如聯合設計模式、泛型程式設計,使程式員可以編寫有表現力的、靈活的、高度可重用的代碼。

《Thinking in C++(C++程式設計思想)》

C++ 領域權威著作,介紹了C++實用的程式設計技術和最佳的實踐方法。

PS:或者參考:《C++必讀書籍推薦》

        個人看法:雖然說,越是C++的高手越不敢說自己精通C++,但是熟讀這些書籍并且能夠熟練的運用,稱之為C++專家應該也不為過了。但是對于大部分人來說,全部讀完這些書籍是不太現實的。也正是這個原因,才會把這些書籍根據不同層次做了一個分類。

        正如Milo Yip所說,正确的做法應該是,循序漸進并在實踐中根據自身的需求逐漸深入。很慚愧,上面列出的書籍本人僅讀過兩三本,而且算不上精讀,目前正在按照計劃逐漸深入,但沒有打算朝“精通C++”的方向狂奔,隻是想在目前的基礎上更深入一點,滿足工作的需要。後續的部落格中,我會适當記錄和分享一下讀書的心得。

三、計劃中本人C++部落格的内容(大牛的計劃稱作“挖坑”,小白的計劃稱作“空想”,希望不要吐槽)

(1)C++基礎知識裡面的一些重點難點

(2)C++的程式設計風格

(3)C++的優點和缺點歸納

(4)C++的适用場合

(3)C++程式的優化

(4)C++的各種範式歸納

(5)C++某些技術的進階

(5)C++的應用以及相關開源項目

有興趣的,可以交流一下

歡迎關注我的個人網站《程式員網》 

->https://www.itmangoto.cn/

IT從業人員需要及時關注技術動态,但是網際網路的内容卻過于離散,好東西往往隐藏得很深。現在可以在微信公衆号裡面 搜尋關注“小魚兒的IT技術分享”,訂閱我為大家每天彙總的IT技術資訊。歡迎大家關注!

  • 有興趣的請點選《與IT技術相關的微信公衆号》
C++書籍

繼續閱讀