C++,YYDS!

大家好,C++ 真的是一門備受爭(zhēng)議的語(yǔ)言,關(guān)于 C++ 的書(shū)籍也是浩瀚如海。
那幾本 C++ 的四書(shū)五經(jīng)想必大家也早已在各路學(xué)習(xí)路線中見(jiàn)過(guò)了。
不過(guò)沒(méi)關(guān)系,今天你依然會(huì)看見(jiàn)它們的身影哈哈哈。
C++ 最大的缺點(diǎn)就是語(yǔ)法復(fù)雜,而且難學(xué)難精。
學(xué)習(xí) C 語(yǔ)言也許一本 K&R 的《C程序設(shè)計(jì)語(yǔ)言》就夠了,但是在 C++ 世界里,找不到這樣一本書(shū)。
這是一個(gè)愛(ài)速成的年代,大多數(shù)人很難耐得住寂寞花很長(zhǎng)時(shí)間去學(xué)習(xí)一門語(yǔ)言,所以《21天學(xué)通C++》的銷量還蠻不錯(cuò)的。
但是很遺憾,別說(shuō) 21 天,就是一兩年也很難學(xué)通 C++ 。
學(xué)好過(guò)程,一定離不開(kāi)讀大量的書(shū)籍甚至標(biāo)準(zhǔn)庫(kù)文檔,
在這里,我也把 C++ 學(xué)習(xí)初略的分為幾個(gè)層次:
一、入門
如果你之前沒(méi)有 C 或者其它語(yǔ)言的基礎(chǔ),我建議看看網(wǎng)上的 C++ 入門教程,比如菜鳥(niǎo)教程、C 語(yǔ)言中文網(wǎng)上面。
這個(gè)過(guò)程你需要了解并且掌握所有編程語(yǔ)言中共同的、最基本的那些概念:
變量、常量、類型、循環(huán)、判斷、數(shù)組、字符串、對(duì)象、輸入輸出等
然后還有 C++ 中一些特有的東西,比如命名空間 namespace、引用、模板等。
以及如何使用一些 STL 中的類庫(kù),比如 string、vector、find 之類的東西。
然后就是輔以大量的練習(xí)。
就那種 C++ 教程的課后練習(xí)題就足夠了,類似水仙花數(shù)、四則運(yùn)算計(jì)算器之類的東西。
如果對(duì)這些沒(méi)什么興趣,可以試試這個(gè)網(wǎng)站,
https://www.codewars.com/kata/search/cpp
有點(diǎn)像 LeetCode 刷算法題一樣,這里針對(duì)每一個(gè)語(yǔ)法知識(shí)點(diǎn)都有一系列的練習(xí)題可供選擇。
而且不僅包含 C++,其它幾乎所有語(yǔ)言都可以在這里進(jìn)行練習(xí):

應(yīng)該兩三周就能過(guò)完菜鳥(niǎo)教程這種級(jí)別的指引吧。
到這里,你對(duì) C++ 包含了哪些知識(shí)點(diǎn)大概有了一個(gè)整體的印象。
并且能夠?qū)懮习傩凶笥业某绦?,但是還是很難寫(xiě)出一個(gè)優(yōu)秀的類。
接下來(lái)需要進(jìn)行全面和深入的學(xué)習(xí),算是真正的入門:
《Accelerated C++》(美國(guó)斯坦福大學(xué)的經(jīng)典教材)
《C++ Primer》(大而全)
《The C++ Programming Language》(C++之父 Bjarne Stroustrup 所著)
這三本,其實(shí)各有優(yōu)缺點(diǎn),第一本優(yōu)點(diǎn)是簡(jiǎn)短,僅僅兩三百頁(yè),只有最為核心和主干的知識(shí)點(diǎn)。
而后兩本則都是大而全,尤其是《The C++ Programming Language》。
這兩本區(qū)別在于,一個(gè)是 C++ 大師所著,一本是 C++ 之父所著。
網(wǎng)上有人說(shuō) 《C++Primer》是目前市面上唯一一本真正的從入門到精通的書(shū),適合初學(xué)者;
《C++ Programming language》 是C++專家自學(xué)指南,顧名思義,適合有較深厚 C++ 功底的讀者。
所以小北推薦的順序是:
《Accelerated C++》->《C++ Primer》->《The C++ Programming Language》
對(duì)于這種上前頁(yè)大部頭我推薦的閱讀方式是,以主題為劃分,比如 C++ Primer 就明確的分為了:
C++ 基礎(chǔ) C++ 標(biāo)準(zhǔn)庫(kù) 類設(shè)計(jì)者的工具 高級(jí)主題
如果有一定的基礎(chǔ)的話,可以看著目錄,看一些自己感興趣的章節(jié),完全沒(méi)有必要從第一頁(yè)開(kāi)始挨著挨著讀。
入門結(jié)束你應(yīng)該掌握以下內(nèi)容:
基礎(chǔ)語(yǔ)言
類與面向?qū)ο?/p>
輸入輸出
字符串處理(類庫(kù)和正則表達(dá)式)
容器類庫(kù)
泛型算法
看著只有幾個(gè)關(guān)鍵字,實(shí)際上每個(gè)展開(kāi)都有很多內(nèi)容需要學(xué)習(xí)。
學(xué)習(xí)過(guò)程中把后面的每一個(gè)練習(xí)題都自己敲一遍,自己多思考對(duì)比一下。
多用代碼去驗(yàn)證自己的想法,尤其是指針、引用、構(gòu)造、析構(gòu)這些地方。
學(xué)習(xí) C++ 以及日常開(kāi)發(fā)一定要記得這幾個(gè)網(wǎng)站,可以隨時(shí)查閱一些語(yǔ)法的用法和標(biāo)準(zhǔn)庫(kù):
cppreferencecplusplusisocpp
二、提高
看完 C++ Primer 這類書(shū),寫(xiě)出來(lái)的代碼在效率、規(guī)范上還是沒(méi)那么 “C++”。
甚至?xí)袃?nèi)存方面的 Bug。
比如返回函數(shù)內(nèi)局部變量的引用,經(jīng)常 pass-by-value 而非 pass-by-reference-to-const。
由于 C++ 是一門系統(tǒng)級(jí)編程的語(yǔ)言,你需要掌握一些 OS 方面的知識(shí)才能更好的使用。
尤其是內(nèi)存編譯鏈接這一塊,比如堆、棧、靜態(tài)鏈接、動(dòng)態(tài)鏈接等等。
還有一些 C++ 里比較特殊的概念,比如 RAII 的資源管理方式、值語(yǔ)義與生命期、引用、右值引用等等。
這些東西似乎沒(méi)有一本很系統(tǒng)的書(shū)籍可以幫助你掌握,只能在不同的書(shū)里吸收完善。
這一塊,我也在路上。
這里給出一些在這些方面有幫助的書(shū)籍:
《Effective C++》
一言概括,就是幫助你快速習(xí)得一些 C++ 里正確的姿勢(shì)。
否則你可能需要用幾萬(wàn)行代碼的經(jīng)驗(yàn)才能慢慢悟出來(lái)。
《程序員自我修養(yǎng)》& 《CSAPP》
幫助你掌握一些系統(tǒng)級(jí)編程的知識(shí)。如內(nèi)存管理、堆棧、鏈接這類在 C、C++ 中極其重要的概念。
《Linux多線程服務(wù)端編程》
這本書(shū)嚴(yán)格來(lái)說(shuō)不是純講 C++ 的。
但是里面會(huì)有一些章節(jié),關(guān)于 C++ 多線程編程、鎖、線程安全、C++ 一些工程實(shí)踐經(jīng)驗(yàn)還不錯(cuò)。
《Google C++ Style Guide》
谷歌的 C++ 代碼規(guī)范,寫(xiě)代碼是一件專業(yè)的事,把代碼寫(xiě)得漂亮、專業(yè)也是一項(xiàng)能力。
谷歌的代碼規(guī)范算是 C++ 領(lǐng)域一個(gè)標(biāo)桿了。
鵝廠很多代碼規(guī)范也是基于谷歌的代碼規(guī)范做了一些適應(yīng)性的改進(jìn)。
在學(xué)習(xí)編程之初就掌握良好的編碼規(guī)范大有裨益。
三、進(jìn)階
上面提到的這些書(shū)重點(diǎn)在于如何使用、用好 C++ 這一個(gè)范疇。
而進(jìn)階,我認(rèn)為則是研究語(yǔ)言一些 case 的具體實(shí)現(xiàn),深刻的思考語(yǔ)言設(shè)計(jì)和演進(jìn)本身。
這里分為三個(gè)部分:
Part1. STL 源碼
侯捷老師說(shuō):源碼之下,了無(wú)秘密。
為了更好的使用 STL,一個(gè)方法就是閱讀 STL 源碼 或者掌握部分實(shí)現(xiàn):
《STL源碼剖析》
這本書(shū)講解了 STL 五大組件的底層實(shí)現(xiàn)。
包括內(nèi)存管理、各類容器的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)、算法的實(shí)現(xiàn)等。
建議列為必讀,可以幫助深入理解 STL 底層。
其中也有很多面試??嫉闹R(shí)點(diǎn),如內(nèi)存池、traits 技法、vector 動(dòng)態(tài)擴(kuò)容、set、map 等實(shí)現(xiàn)原理等。
Part2. 對(duì)象模型
《深度探索C++對(duì)象模型》
這本書(shū)其實(shí)就是圍繞一個(gè)點(diǎn):C++ 里的對(duì)象是在內(nèi)存中是如何組織的。
這是每個(gè)章節(jié)內(nèi)容:
關(guān)于對(duì)象 構(gòu)造函數(shù)語(yǔ)意學(xué) Data語(yǔ)意學(xué) Function語(yǔ)意學(xué) 構(gòu)造、解構(gòu)、拷貝語(yǔ)意學(xué) 執(zhí)行期語(yǔ)意學(xué)
我第一次看見(jiàn)這本書(shū)就被深深的吸引了,當(dāng)時(shí)在學(xué)校,每天看八九個(gè)小時(shí),花了大概一周刷完了。
看完這本書(shū)感覺(jué)自己對(duì)于 C++ 的底層實(shí)現(xiàn)機(jī)制有了更深的理解。
比如多重繼承、菱形繼承、虛函數(shù)底層的實(shí)現(xiàn)機(jī)制等等。
當(dāng)然了,也有人會(huì)認(rèn)為對(duì)象如何在底層實(shí)現(xiàn)屬于 C++ 編譯器實(shí)現(xiàn)細(xì)節(jié),而非語(yǔ)言標(biāo)準(zhǔn),不應(yīng)該以實(shí)現(xiàn)細(xì)節(jié)倒推標(biāo)準(zhǔn)。
誠(chéng)然如此,掌握實(shí)現(xiàn)細(xì)節(jié)還是會(huì)對(duì)你理解 C++ 有促進(jìn)作用。
Part3. 語(yǔ)言設(shè)計(jì)與演化
這里重點(diǎn)是思考 C++ 語(yǔ)言很多語(yǔ)法的設(shè)計(jì)和演進(jìn)方向,可以看看 C++ 之父 Bjarne Stroustrup's FAQ、《C++設(shè)計(jì)與演化》。
設(shè)計(jì)與演化這本書(shū)重點(diǎn)在于通過(guò) C++ 之父去窺見(jiàn) C++ 的前世今生。
看完這本書(shū)的意義,功利一點(diǎn)來(lái)說(shuō),或許對(duì)于提高 C++ 編程能力沒(méi)有太多幫助的,不像 Effective 是立竿見(jiàn)影的效果。
但是,對(duì)于加深對(duì) C++ 的理解很有幫助。
想要更好的使用 C++ 構(gòu)建好的、高效的系統(tǒng),對(duì)語(yǔ)言本身的深入理解是先決條件。
另一方面,書(shū)中提到了很多語(yǔ)言設(shè)計(jì)的思想、哲學(xué),這些,相信在學(xué)習(xí)其他編程語(yǔ)言的時(shí)候也是有幫助的。
四、關(guān)于書(shū)單
這篇文章中對(duì)于書(shū)籍,我的一個(gè)原則就是能省則省,因?yàn)?C++ 相關(guān)的優(yōu)秀書(shū)籍實(shí)在太多了,我只想挑出每個(gè)階段最有用的的書(shū)。
書(shū)不在多,貴在精。
看書(shū)也是一樣的,我推薦書(shū)不一定都需要去看完,深入細(xì)致的閱讀完一本技術(shù)書(shū)比走馬觀花似的閱讀 N 本更有效。
當(dāng)然了,后面我也會(huì)推出一份分門別類整理后的 C++ 書(shū)單供大家索引。
四、關(guān)于視頻
對(duì)于初學(xué)者來(lái)說(shuō)看書(shū)也許確實(shí)很難 get 到那個(gè)點(diǎn),就像我大一看 C 語(yǔ)言的教材里說(shuō)文件分為文本流文件和二進(jìn)制流文件,當(dāng)時(shí)我愣是理解不了。
很多對(duì)于會(huì)的人是常識(shí)的東西,對(duì)于初學(xué)者就是無(wú)法理解、很難的概念。
那也許通過(guò)別人講授、視頻的方式會(huì)更容易入門一點(diǎn),這里推薦浙大翁凱的 C++ 視頻。
翁凱老師無(wú)論是 C、C++、Java 的視頻都講得非常深入淺出,只能說(shuō)水平越是高的人講的課越容易明白。
這是網(wǎng)易云課堂地址:
https://study.163.com/course/introduction/271005.htm
另外還要推薦侯捷老師的一些列課程:

我當(dāng)時(shí)看見(jiàn)這些標(biāo)題:《內(nèi)存管理》、《C++11》、《STL源碼分析》......
簡(jiǎn)直如獲至寶一樣,一個(gè)寒假就把這些視頻全看完了,對(duì)于 C++ 和內(nèi)存管理方面理解提高了很多。
真的非常感謝 B 站、感謝這些講師和分享者,甚至要感謝互聯(lián)網(wǎng)時(shí)代!
他們讓知識(shí)的傳播變得更加的便捷,降低了后來(lái)者的學(xué)習(xí)門檻,當(dāng)然啦也變相加重了內(nèi)卷化hahah(逃
還有一個(gè)我最近發(fā)現(xiàn)的一個(gè)視頻,是一個(gè)國(guó)外 C++ 游戲引擎開(kāi)發(fā)工程師錄制的一套偏向 talk 類型的教程,比較通俗易懂和深入淺出,
推薦一下:
https://www.bilibili.com/video/BV1Ay4y1i7Z6

END
送給學(xué)習(xí) C++ 的同學(xué)一段翁凱老師講課說(shuō)的話:
學(xué) C++ (計(jì)算機(jī))一定要有一個(gè)非常強(qiáng)大的心理狀態(tài)
什么呢
C++ (計(jì)算機(jī))的所有東西都是人做出來(lái)的,別人能想出來(lái)的我也一定想得出來(lái),在 C++(計(jì)算機(jī))里頭沒(méi)有任何黑魔法,所有的東西只不過(guò)是我現(xiàn)在不知道而已
總有一天我會(huì)把它里面的細(xì)節(jié)搞明白的!
好啦,以上就是今天的分享啦,覺(jué)得不錯(cuò)的話,不要吝嗇你的點(diǎn)贊和在看喲~
