C++书籍
(雖然沒啥價值,但是轉載請標明作者和出處)
歡迎關注我的個人網(wǎng)站《程序員網(wǎng)》?
->https://www.itmangoto.cn/
背景:
? ? ? ? 最近面試了幾份C++的工作,被虐出了翔。原因很簡單,自己做C++的時間不短,但是缺乏系統(tǒng)的學習,很多東西都是“知其然不知其所以然”。
就好像我喜歡看知乎,關于各類的問題,都能略知一二,但是往往看到各行各業(yè)的大牛的一些精彩回答,就會自慚形愧。離散化的知識體系造就的是一個多面手,知道如何整合資源,如何用最低的成本去解決問題,很多時候甚至會有一種“一夫當關,萬夫莫開”的感覺。
? ? ? ? 我曾經(jīng)試過在一個項目里,從硬件到軟件、從客戶端到服務器、從單片機到windows到linux再到Android、從方案設計到軟硬件采購、從前端到后臺、從客戶需求分析到設計到編碼、從開發(fā)到測試都一手包辦了。這樣的人,在很多小公司任職具有相當大的優(yōu)勢,拿著一個人的工資,做的是很多個人的活。結果是,自己累到就像一條狗(更可悲的是,拿的工資就只有半狗)。然后在離職跳槽的過程中,被鄙視得體無完膚,尤其是在大公司的面試里。有感于此,我打算重新打磨一下的技能。
? ? ? ? 我認為自己目前是一個“一”字型的人,很多大公司里面的人是“1”字型的。我對自己的規(guī)劃是,成為一個“十”字型的人才,甚至是一個“卅”字型的人才。但是,這是一條特別艱難的路,而且一不小心就會墮入到萬劫不復的深淵。but,沒有人能夠改變我的想法,我會堅持下去。
?
正文:
? ? ? ? 好吧,下面是C++博客的開篇。就暫且先總結歸納一下C++的學習方法,列一下書單,以及對接下來的博客內容做個提綱。
?
一、C++學習方法
? ? ? ? 如果我說,C++是一門難學難精的語言,估計沒有人會反對。這里所提及到的學習方法和路線,并不全是我個人的看法,很多都是借鑒一些前輩和C++專家的看法,主要的目的是幫助我自己制定學習計劃,也順便記錄下來供其他朋友參考。
? ? ? ? 本人有數(shù)年的編程經(jīng)驗,從最坑爹的匯編,到面像過程的C語言,到面相對象的C++、Java、C#,到函數(shù)式的Lisp都有學習和使用過。C++學習和使用了大概兩三年的時間。除了大學期間的C++課程以外,再也沒有系統(tǒng)的學習和研究過C++。工作以來,斷斷續(xù)續(xù)的用C++進行過開發(fā),包括在windows上面的Visual C++,Linux上用vim和g++,以及開源的UI庫Qt。中間的學習過程主要是,在使用到相關的知識和技術的時候,查閱書籍和別人的博客。
?
? ? 因此,我其實只能算是一個C++新手,博客的內容部分涉及一些基礎知識的學習,然后寫一些C++進階與提高的內容。
?
(1)學習C++的四個層次(引自《C++強大背后》,作者是Milo Yip大牛)
?
? ? ? ? 1.第一層次,C++基礎:挑選一本入門書籍,如《C++ Primer》、《C++大學教程》、或Stroustrup撰寫的經(jīng)典《C++程序設計語言》或他一年半前的新作《C++程序設計原理與實踐》,而一般C++課程也止于此,另外《C++ 標準程序庫》及《The C++ Standard LibraryExtensions》可供參考;
? ? ? ? 2.第二層次,正確高效地使用C++:此層次開始必須自修,閱讀過《(More)Effective C++》《(More)Exceptional C++》、《Effective STL》及《C++編程規(guī)范》等,才適宜踏入專業(yè)C++開發(fā)之路;
? ? ? ? 3.第三層次,深入了解C++:關于全局問題可讀《深入探索C++對象模型》、《Imperfect C++》、《C++沉思錄》、《STL源碼剖析》,要挑戰(zhàn)智商,可看關于模版及模版元編程的書籍如《C++ Templates》、《C++設計新思維》、《C++模版元編程》;
? ? ? ?4.第四層次,研究C++:閱讀《C++語言的設計和演化》、《編程的本質》(含STL設計背后的數(shù)學根基)、C++標準文件《ISO/IEC 14882:2003》、C++標準委員會的提案書和報告書、關于C++的學術文獻。
? ? ? ? 5.Milo Yip的建議:“由于我主要是應用C++,大約只停留于第二、三個層次。然而,C++只是軟件開發(fā)的一環(huán)而已,單憑語言并不能應付業(yè)務和工程上的問題。建議讀者不要強求幾年內“徹底學會C++的知識”,到達第二層左右便從工作實戰(zhàn)中汲取經(jīng)驗,有興趣才慢慢繼續(xù)學習更高層次的知識。雖然學習C++有難度,但也是相當有趣且有滿足感的。”
?
? ? ? ? 尤其是對于新手來說C++的內容較多,試圖通過一本教材或者入門書籍從而掌握C++各方面的知識,幾乎是不可能的。比較明智的做法是,先掌握一些基本的知識和比較重點的內容,然后嘗試寫一些比較短的代碼或者小型的項目,在實踐過程中碰到了問題再仔細深入研究。
?
PS:此外我這里提及一下劉未鵬的觀點。(至于他是程序里面的top0.1%還是top1%還是top5%,這里不作討論。個人覺得他的看法還是挺實在的)
原文請參考:《你應當如何學習C++(以及編程)》
? ? ? ? 1.C++語言的細節(jié)太多
? ? ? ? 2.一些著名的C++書籍在暗示語言細節(jié)的重要性和有趣
? ? ? ? 3.現(xiàn)代C++庫的開發(fā)哲學必須用到一些犄角旮旯的語言細節(jié)
? ? ? ? 對于廣大的C++程序員呢,以為掌握了更多的語言細節(jié)就更牛,但實際卻是那些語言細節(jié)十有八九是平時編程用都用不到的。C++中眾多的細節(jié)雖然在庫設計者手里面有其用武之地,但普通程序員則根本無需過多關注,尤其是沒有實際動機的關注。一般性的編碼實踐準則,以及基本的編程能力和基本功,乃至基本的程序設計理論以及算法設計。才是真正需要花時間掌握的東西。(他稱之為“懶惰原則”,或許這可以安慰一下在C++筆試中被虐的我)
?
? ? ? ? 應該說,劉的看法和本文所提及的C++學習路線其實并不沖突。C++學習路線,主要是給出一條從了解、到掌握、到熟練、到精通、到深入研究C++的思路,而劉的看法是從一個普通的C++語言使用者的角度來提醒初學者不必要過度的深入細節(jié)。
?
(2)C++中接觸到的編程范式(引自輪子哥)
1.面向對象(靈活應用virtual繼承+shared_ptr可以達到java/C#的效果)
2.模板(這里分兩類,分別為type rich programming和meta programming,區(qū)別很大)
3.函數(shù)式編程(如今有了lambda,配合<algorithm>文件,簡直無敵了)
4.面向過程
?
1)當我搞語言設計和編譯器的時候,我總是會傾向于創(chuàng)造各種小DSL來給自己用,用的都是模板(想想boost的spirit大概就明白我的意思了,雖然我不用它),盡量讓跟我有同樣背景的人一眼能看懂我代碼的意思。
2)當我做我那個GUI庫(www.gaclib.net)的時候,純粹是用OO和IoC那一套。
3)當我寫3D渲染程序的時候,我會變成一個為了性能不惜犧牲可讀性的人。
?
? ? ? ? 如輪子哥所說,未必需要每一種都深入。但是如果經(jīng)常需要用到C++和使用C++干活的人來說,起碼要有所了解。
?
(3)C++的具體應用(引自MiloYip)
? ? ? ? C++并非萬能,我按經(jīng)驗舉出一些C++的適用時機。
(1)C++適合構造程序中需求較穩(wěn)定的部分,需求變化較大的部分可使用腳本語言;
(2)程序須盡量發(fā)揮硬件的最高性能,且性能瓶頸在于CPU和內存;
(3)程序須頻繁地與操作系統(tǒng)或硬件溝通;
(4)程序必須使用C++框架/庫,大部分游戲引擎(如Unreal/Source)及中間件(如Havok/FMOD),有些C++庫提供其他語言的綁定,但通常原生的API性能最好最新;
(5)項目中某個目標平臺只提供C++編譯器的支持。
? ? ? ? 按應用領域來說,C++適用于開發(fā)服務器軟件、桌面應用、游戲、實時系統(tǒng)、高性能計算、嵌入式系統(tǒng)等。
?
?歡迎關注我的個人網(wǎng)站《程序員網(wǎng)》?
->https://www.itmangoto.cn/
二、C++書單
? ? ? ? 這里不想討論譚浩強老師的教材是好是壞。但是想在IT和編程領域更進一步,多看外國權威著作甚至英文原版,是必然的選擇。上面的C++學習的四個層次中,已經(jīng)提及了很多,下面再做一個詳細一點的歸納(引自知乎,作者不詳)。
(1)階段 1
《Essential C++》
這是一本內容不多但很實用的C++入門書籍,強調快速上手與理解C++編程。本書主要圍繞一系列逐漸復雜的程序問題,以及用以解決這些問題的語言特性展開講解。你不只學到C++的函數(shù)和結構,也會學習到它們的設計目的和基本原理。
《C++ Primer》
本書對C++基本概念、技術、以及現(xiàn)代C++編程風格進行了全面而且權威的闡述,是C++初學者的最佳指南;本書可以幫助你編寫實用的程序,而無需首先精通每個語言細節(jié)。對于中高級程序員,本書也是不可或缺的參考書。
(2)階段 2
《Effective C++》和《More effective C++》
作者是Scott Meyers。你應該熟讀它們,并清楚地理解每個項目。該書圍繞55條準則,每一條都介紹了一個可讓你寫出更好的C++程序代碼的方法,并以特別設計過的例子詳加討論。
《Exceptional C++(C++編程剖析)》和《More exceptional C++》
這兩本書中都包含了40個C++編程問題,這些問題會讓你磨練自己的技能,最終成為優(yōu)秀的C++程序員。這些問題是Herb Sutter精心挑選,與ISO/ANSI C++官方標準相一致,幫助程序員在設計、架構和編碼過程中保持良好的風格,從而使編寫的C++軟件更健壯、更高效。
(3)階段 3
《Inside the C++ object model(深度探索C++對象模型)》
本書專注于C++面向對象程序設計的底層機制,包括結構式語意、臨時性對象的生成、封裝、繼承,以及虛擬——虛擬函數(shù)和虛擬繼承,幫助你理解程序的底層實現(xiàn),以便寫出更高效的代碼。
《The design and evolution of C++(C++語言的設計與演化)》
本書作者也是C++語言的設計者Bjarne Stroustrup,作者在書中綜合性地介紹了C++的發(fā)展歷史,C++中各種重要機制的本質意義和設計背景,這些機制的基本用途和使用方法,討論了C++所適合的應用領域及其未來的發(fā)展前景,既沒有忽略關鍵性的詳情,又沒有過多地陷入技術細節(jié)。
(4)階段 4
《The C++ standard library(C++標準程序庫)》
這是標準模板庫字典,你可以在本書中找到STL相關的一切知識。本書焦點放在標準模板庫、檢查容器、迭代器、函數(shù)對象和STL算法上。每一個元素都有深刻的呈現(xiàn),包括其介紹、設計、運用實例、細節(jié)解說、陷阱、意想不到的危險,以及相關類別和函數(shù)等。
《Effective STL》
這是Scott Meyers的第三本C++專著,也是學習STL最權威的書籍。作者對書中的50個指導方針都作了詳盡的分析,并配以示例。通過這些規(guī)則,C++開發(fā)者可以最大限度地使用STL。
《Generic programming and the STL(泛型編程與STL)》
本書闡述了泛型程序設計的核心理念:concepts(概念)、modeling(模型)和refinement(改善),并為你展示這些觀念如何導出STL的基礎概念:iterators(迭代器)、containers(容器)和function objects(函數(shù)對象)。按照本書所述,你可以把STL想象成一個由concepts組成的library,你將學習到STL正式結構并理解其強大的優(yōu)勢。
(5)階段 5
《Exceptional C++ style》
作者為Herb Sutter。本書同樣提出了40個C++風格相關的問題,對一些至關重要的C++細節(jié)和相互關系提出了新的見解,為當今的關鍵C++編程技術(如泛型編程、STL、異常安全等)提供了新的策略,幫助開發(fā)者在開銷與功能之間、優(yōu)雅與可維護性之間、靈活性與過分靈活之間尋找完美的平衡點。
《C++ template》
這是一本關于C++模板的完整的參考手冊和教程,它強調模板的使用實踐,包含了現(xiàn)實世界中的例子。每個C++程序員都應該好好讀一讀這本書。
《Modern C++ design(現(xiàn)代C++設計)》
作者Andrei Alexandrescu為C++程序員打開了一個新的局面。本書提供了一些針對軟件設計的前沿方法,如聯(lián)合設計模式、泛型編程,使程序員可以編寫有表現(xiàn)力的、靈活的、高度可重用的代碼。
《Thinking in C++(C++編程思想)》
C++ 領域權威著作,介紹了C++實用的編程技術和最佳的實踐方法。
?
PS:或者參考:《C++必讀書籍推薦》
?
? ? ? ? 個人看法:雖然說,越是C++的高手越不敢說自己精通C++,但是熟讀這些書籍并且能夠熟練的運用,稱之為C++專家應該也不為過了。但是對于大部分人來說,全部讀完這些書籍是不太現(xiàn)實的。也正是這個原因,才會把這些書籍根據(jù)不同層次做了一個分類。
? ? ? ? 正如Milo Yip所說,正確的做法應該是,循序漸進并在實踐中根據(jù)自身的需求逐步深入。很慚愧,上面列出的書籍本人僅讀過兩三本,而且算不上精讀,目前正在按照計劃逐步深入,但沒有打算朝“精通C++”的方向狂奔,只是想在目前的基礎上更深入一點,滿足工作的需要。后續(xù)的博客中,我會適當記錄和分享一下讀書的心得。
?
?
三、計劃中本人C++博客的內容(大牛的計劃稱作“挖坑”,小白的計劃稱作“空想”,希望不要吐槽)
(1)C++基礎知識里面的一些重點難點
(2)C++的編程風格
(3)C++的優(yōu)點和缺點歸納
(4)C++的適用場合
(3)C++程序的優(yōu)化
(4)C++的各種范式歸納
(5)C++某些技術的進階
(5)C++的應用以及相關開源項目
有興趣的,可以交流一下
?
?
歡迎關注我的個人網(wǎng)站《程序員網(wǎng)》?->https://www.itmangoto.cn/
- 有興趣的請點擊《與IT技術相關的微信公眾號》
?
總結
- 上一篇: linux怎么烧写文件系统,烧写LINU
- 下一篇: C++层Binder——Bn、Bp