如何學習C++?

Python實戰講師團發表於2018-08-14

本文轉自:TDiger

關於如何學習一門程式語言、學好一門程式語言,一直為眾多技術愛好者津津樂道,本文為大家總結了一些方法。更推薦了技術學習途徑,文中為大家推薦了技術教程,文末加入驚喜彩蛋。

 

為什麼 C/C++?

C++ 是一門程式語言,請注意它僅僅是一門程式語言。這句話的意思就是一旦有人在做語言好壞之爭的時候,一笑而過即可。特定的語言只是用來在特定的領域解決特定的問題,僅此而已,尤其是現在眾多語言紛飛的年代,這句話的正確性不容置疑。

在程式設計領域裡,每個人都會有他/她的入門語言,各持己見。我個人認為 C 語言是一個很不錯的選擇,語法簡單,深度可深可淺,高階語言的鼻祖。很重要的一點是現今的各種程式語言,或多或少都是 C 語言的衍生品,或者是衍生品的衍生品。語言相通,只要 C 語言學好了,上手其他語言問題不大。C 語言的靈魂在於指標,指標可以幫助你更好的理解記憶體,理解作業系統的工作機理。

C++ 就是 C 的衍生品之一,相容 C 語言。起初的目的是擴充套件 C 語言“C with Classes”,但是後來隨著發展,C++ 標準中加入了:虛擬函式(virtual function)、運算子過載(operator overloading)、多重繼承(multiple inheritance)、模板(template)、異常(exception)、RTTI、名稱空間(name space)等。C++ 變得強大的同時也變的異常複雜,同時隨著新內容的增加,C++ 離 C 也就越來越遠(思想而非語法)。

C++ 是一門爭議性語言,喜歡研究的人很多,吐槽的(包括一些大神級的人物)的人也很多。在 C/C++ 的時代(C/C++剛出道的時候),語言的可選性較少,所以 C++ 幹了許多事情,現在時代不一樣了,正如我前面所謂語言紛飛,針對性語言眾多,程式設計師的選擇性也就多了(有很多的優秀的語言可以去學,C#,java,php,python,ruby……),所以 C++ 不再是必須品。

在你開始學習之前,請慎重考慮一下,為什麼要學?如果考慮好了,請繼續閱讀。

C++新手

選擇一本好書

如果你發現以“數字”命名的書籍,請扔掉!(21天學通C++?)
如果你發現以“通”字樣命名的書籍,請扔掉!(零起點學通C++?C++從入門到精通?)
如果你發現把“Visual” 和 “C++” 聯絡起來的 C++ 教程,請扔掉!(太多了,不舉例了)
如果你發現“void main”作為例項的書籍,請扔掉!
……

有幾本書可以供你選擇:《C++ Primer Plus》,《C++ Primer》,《C++程式設計語言

我入門用的是《C++入門經典》,繼而讀的是《C++ Primer》。其實好書和差書很容易區分,厚度和價位是一個很關鍵的點,通常薄薄的,又便宜,書名卻非常霸氣的告訴你如何精通,那你果斷扔了,想都不要想。

也為大家選擇了一些好的課程:1.《C語言/C++學習指南》單步除錯《C語言/C++學習指南》語法篇(從入門到精通)C++面試筆試精要,《C語言/C++學習指南》Qt介面開發篇,《C語言/C++學習指南》動態庫和靜態庫。2.C Primer用ffmpeg開發螢幕錄製C++ Boost庫程式設計利用webrtc搭建視訊會議系統

選擇一個好的IDE

請注意我強調的是IDE(整合開發環境),而不是套餐(GCC+VIM/EMACS+GDB+[linux]),對於一個初學者來說,一定要抓住重點。

那個套餐NB麼?NB! 酷麼?太酷了!學麼?可以學,但不是現在。現在你需要的輸入幾行程式碼,然後執行處結果,如果有小問題,可以方便除錯的工具。gcc,vim/emacs,gdb,linux 必須承認,它們很優秀,但是學好很需要時間。不誇張的說,入手vim/emacs or linux 比入手 C++ 的時間只多不少。初學者一定要相信這一點,網上太多人吹噓學 C++ 不應該用 IDE ,就應該直接 文字編輯器+GCC 用 GDB 除錯,進而言語鄙視 IDE 。我不知道你抱著什麼心態,我只想說你入門是那樣入門的嗎?當時有沒有 IDE ?你瞭解 IDE 嗎?你公司用什麼開發?

IDE 除錯底層呼叫的也是除錯工具,對除錯工具進行封裝,使之更為人性化了些。技術永遠不是用來炫酷和裝B,是用來解決實際問題的。因此,不管你用什麼語言,什麼工具,什麼平臺,只要能把事情做好就行了。

對於一個入門新手,一個人性化的除錯環境是必須的。當然,作為一個 C++ 程式設計師的話,GCC/GDB 是必須要去了解的,linux 也是必須要會的。

IDE 我推薦使用 CodeBlocks,C++ 標準支援的好,開源,跨平臺,免費,非常優秀。Microsoft Visual Studio 20XX 也是可以的。忠告:同學們,千萬不要再用 VC++ 6.0 了,對 C++ 標準支援極差,謹記!

我學習一直用的是 CodeBlocks 10.05 今天好像已經是 12.11 ,軟體開發用的是:VS2005,VS2008,VS2010。個人感覺 08 沒有 05 和 10 好用。

保持一顆平靜的心

給大家看一篇文章:“21天教你學會C++”。“想要 21 天學會C++,首選需要花8年時間學會 C++,然後去學量子物理,生物化學,分子生物學,以及遺傳學,製造“返老還童”藥劑,把自己傳送回學程式設計的21天”——這是迄今為止我所知道的最容易的《Teach Yourself C++ in 21 Days》,推薦大家去看看原文。

大家再去看一篇文章:“C++ 程式設計師自信心曲線圖”,“對於大多數的自稱自己熟悉C++的程式設計師來說,基本上來說他們都是用C++的語法來寫C。”

保持一顆平靜的心是很重要的,切記不要急於求成,切記不要浮躁。學習 C++ 不是三天兩天的事情,文中也說了,用 10 年時間來學習程式設計。你準備好了嗎?

有人天真的以為學幾天 C++ 就可以寫軟體了,後來發現學了之後還是什麼也幹不了,軟體需要介面,於是去學 MFC,學了 MFC 後才發現 MFC 沒什麼,反而是 C++ 基礎太差,反過頭來繼續學習 C++。那個天真的人就是我,我就是這麼過來的。高階的背後也無非都是一行行基礎的程式碼,只要把基礎打好了,高階也就沒什麼了(這裡的高階並不是特指 MFC 高階,基礎也不是特指 C++,任何事物我想都是一樣的)。我想告誡大家,打好基礎比學高階的技術要有用的多,所以不要急。

還需要什麼?

我覺得足夠了,一本好書,一個好IDE,一顆平靜的心態(當然你要有一臺PC機了)。有三點我需要說明一下,第一,平臺的選擇,這個無所謂的,C++ 是跨平臺的,學 C++ 標準就好了;第二,去培訓機構培訓會不會學的快一點?我對培訓只用兩個字總結“扯淡”,真是扯淡。第三,視訊學習?我不推薦。就好像很多人學MFC,看孫鑫的視訊一樣。我們又不是小孩子了,學東西需要手把手嗎?再者說了,手把手教的東西都是死的。當你手裡握著一把錘子的時候,你會發現這個世界全都是釘子。解決問題的方法有很多種,視訊能教給你的只是那麼固定的一種或者幾種,思維定勢是很可怕的事情。

我個人是非常不贊同去花錢培訓,或者呆呆的在電腦前面看視訊。

學習是一種經歷,進而這種經歷就變成了你寶貴的經驗。遇到問題,勤于思考分析,查閱資料,逐漸的培養出了自己快速、獨立解決問題的一套方法,這才是你的財富,這才能以不變應萬變。對於程式設計師來說,就是對 BUG 敏銳的嗅覺。

C++入門(停留在表面)

參考標準:熟練掌握 C++ 語法結構,瞭解 C++ 主要模組,技術難點。大部分書上可以找到的知識點。

學習 C++ 要不要學習 C ?

作為這樣的一篇文章,這個探討幾乎是必須要做的。我的觀點很明確,要學!因為我先學 C 語言,後學的 C++ 的,而且學習使用過程中無數次穿插的相互學習。我的程式中從來沒有刻意的區分這是 C 還是 C++,我把握的標準是怎麼樣方便怎麼來。就好像檔案讀寫我從來都不用 C++ 的檔案流,因為我習慣了 C 語言的 fread、fwrite、 fopen、 fseek、 ftell 等等。我是站在語言的語法和庫的角度來說“要學”的。如果你要學物件導向的話,那就沒必要學 C 了,好像也沒有學 C++ 的必要了,你可以選擇一個純物件導向的語言去學物件導向豈不更好。總結,以我的個人經歷來說,學 C++ 可以先學習 C 語言(觀點已明確,探討結束!)。

要了解哪些東西呢?總結是兩點:語法和庫。所有的語言幾乎都是一樣的。

  1. 語法[基本型別、標準庫型別、陣列和指標、表示式、語句、函式等]
  2. STL[容器,演算法]
  3. 模板與泛型程式設計
  4. 類與物件導向

語法熟練的是必須的;熟練使用 STL 程式設計,物件導向思想不是一天兩天就可以有的,需要不斷的歷練和實戰才能培養出來的;物件導向在C++中的實現方式一定要熟(繼承,派生,虛擬函式等);模板的實參演繹要搞清楚。

如何實現入門?

C++進階(技術研究)

參考標準:內部機理,奇淫技巧

  1. 深入C++內部,探究實現的機理[為什麼模板不支援分離編譯?虛擬函式/多重繼承是怎麼實現的?型別轉換做了那些事情?異常處理?等]
  2. STL原始碼學習[學習別人的設計方法?為什麼STL效率高(為達效率,無所不用其極)?學習資料結構和演算法?記憶體池?RTTI?等]
  3. 記憶體[理解指標運算?記憶體對齊?類的記憶體佈局?new/delete 和 malloc/delete的區別?函式變參的實現?儲存方式?智慧指標?等]
  4. 編譯器在編譯,連結的過程中偷偷的做了那些事情。[如何分析編譯器的提示?連結錯誤代表可能出現哪些問題?等]
  5. 跟上C++庫的潮流,研究新標準。

如何實現進階?

  1. 看書。Effective 系列書籍,《STL原始碼剖析》,《C++標準程式庫》,《C++沉思錄》,《高質量C/C++程式設計》,《C++程式設計思想》,《深度探索C++物件模型》等。
  2. 寫軟體,遇到問題之後自己折騰,自己探索。
  3. 逛社群,回答別人的問題。
  4. 多看看別人的部落格。
  5. 結交自己的技術圈子。
  6. 也為大家選擇了一些好的課程:1.《C語言/C++學習指南》單步除錯《C語言/C++學習指南》語法篇(從入門到精通)C++面試筆試精要,《C語言/C++學習指南》Qt介面開發篇,《C語言/C++學習指南》動態庫和靜態庫。2.C Primer用ffmpeg開發螢幕錄製C++ Boost庫程式設計利用webrtc搭建視訊會議系統

C++高手(走出C++)

參考標準:物件導向程式設計,泛型程式設計

面相物件和泛型程式設計是 C++ 的精粹,學好這些方面光靠書本上的知識是不夠的,只有大量的實戰才能切身體會它們的優勢。

很多人自以為自己C++學的很不錯了,其實他只是在用C的方式寫C++程式碼而已,這句話不無道理。

如何成為高手?

C++腦殘粉(回首C++)

參考標準:為什麼 C++ 是 C++

去了解C++的歷史,它的哲學觀。為什麼 C++ 包括現在這些成分,為什麼會如此複雜,為什麼會有那麼多的缺陷。總之,為什麼 C++ 成為了 C++ ,而不是別的?這實在是值得思考的一個問題。

如何成為腦殘粉?

  1. 看書。《C++語言的設計和演化》
  2. 蒐集野史。
  3. 也為大家選擇了一些好的課程:1.《C語言/C++學習指南》單步除錯《C語言/C++學習指南》語法篇(從入門到精通)C++面試筆試精要,《C語言/C++學習指南》Qt介面開發篇,《C語言/C++學習指南》動態庫和靜態庫。2.C Primer用ffmpeg開發螢幕錄製C++ Boost庫程式設計利用webrtc搭建視訊會議系統

好了,總結了這許多,我個人理解的 C++ 學習歷程應該是這樣的。但是並不意味你看了我列舉的書籍都成為高手了。一來,我列舉的書籍不夠全面;再者,我在上文中不斷重複的兩個字眼是“實戰”,書上的東西永遠是死的,只有經過不斷的實戰才能將這些知識融會貫通。


接下來我們漫談 C++ 學習吧,我喜歡漫談,上面這種中規中矩方式不是我擅長的(我擅長的是閒扯淡)。把 C++ 孤立起來的學習過程是緩慢的,只有腦子中有了整個的一個“計算機知識體系”,才能相互促進,進步的才快。

什麼是計算機知識體系呢?

  1. 作業系統。這算是計算機第一大課。沒有原因,必須要學好。程式管理?記憶體管理?檔案管理?I/O通訊?
  2. 計算機組成原理。整數的加減乘除?浮點數表示法?補碼?中斷與DMA?
  3. 組合語言。不要求能寫,但是能看懂程式碼的反彙編就夠了。
  4. 資料結構和演算法。不做解釋。
  5. 編譯原理。“scanner->parser->semantic analyzer->source code optimizer->code generator->target code optimizer”可有印象?
  6. 計算機網路。TCP/IP?
  7. C語言
  8. 也為大家選擇了一些好的課程:1.《C語言/C++學習指南》單步除錯《C語言/C++學習指南》語法篇(從入門到精通)C++面試筆試精要,《C語言/C++學習指南》Qt介面開發篇,《C語言/C++學習指南》動態庫和靜態庫。2.C Primer用ffmpeg開發螢幕錄製C++ Boost庫程式設計利用webrtc搭建視訊會議系統

看了這幾項,你也許會說:“臥槽,那個,那個不就是我當年逃過的課嘛?”,沒錯,這就是我們當年逃過的課,它確實這般的重要。不求別的,只要你瞭解這幾大課,我敢說你 C++ 中的大部分關於記憶體,編譯器編譯連結的問題已經解決了。而且不管你是學 C++,還是學其他技術,水到渠成,一點就透。因為這是基礎,你把基礎打好了,萬變不離其宗的。

你現在所會的 C++,你自以為學的很不錯,可是你給別人2個月或者3個月時間耐心學,一樣可以學的和你一樣,甚至比你要好。那麼你學的價值在哪兒呢?我學了好幾年的C++別人幾個月一樣可以學到?是的,你以為C++有多少東西?!怎麼樣才能做到別人超不過你呢?

  1. 學習這些計算機體系大課,你腦中的體系結構已經和你學的 C++ 融合到了一起,你腦中的類是存在記憶體中的,你的遞迴是在棧中不斷的壓棧,而他的只看到的是程式碼。這也就是為什麼我不贊成你培訓機構的原因,培訓機構不會教會你這些學科大課的。他只會告訴你C++的函式是怎樣宣告的,類要怎樣書寫,而這些 100 塊錢買一本書,坐著看幾天都學會了。何必花那麼多錢去培訓。
  2. 多寫程式碼,多調程式。培養錯誤的感知能力。
  3. 學會挖掘,多思考。
  4. 一些受歡迎的課程:1.《C語言/C++學習指南》單步除錯《C語言/C++學習指南》語法篇(從入門到精通)C++面試筆試精要,《C語言/C++學習指南》Qt介面開發篇,《C語言/C++學習指南》動態庫和靜態庫。2.C Primer用ffmpeg開發螢幕錄製C++ Boost庫程式設計利用webrtc搭建視訊會議系統

如果你的 C++ 僅僅停留在表面上的,賣弄技術,別人三兩個月學的一定比你好。

前幾年混跡 CSDN ,老趙的一句話非常之流行:“計算機組成原理→DOS命令→組合語言→C語言(不包括C++)、程式碼書寫規範→資料結構、編譯原理、作業系統→計算機網路、資料庫原理、正規表示式→其它語言(包括C++)、架構……”,確實很有道理。

再看本文的題目吧:如何學習 C++,其實我的重點不想放在 C++ 上,我更想探討的是如何學習的問題,C++ 只是一個例項。

現在的網際網路是浮躁的,導致現在的學生是浮躁的,都想一步登天。現在學習環境的骯髒的,是個人都想出來賺幾聲吆喝,就拿部落格園的首頁口水戰一樣,你噴我,我噴你,其實到最後都不知道大家在噴什麼,只知道必須站出來噴一下證明自己的存在!這是多麼可悲的一個環境。有這閒工夫多寫幾遍技術文章不必什麼都強?新技術層出不窮,眼花繚亂,不知道該什麼,有人說好的,必定有人在噴。作為新手,你當如何選擇?我開始慶幸我當時的無知,無知給了我更少的選擇,才有了選擇。作為一個旁觀者,我能做的不多,我不敢深入其中,只能站的遠遠的吶喊。

“我建議大家把那幾個學科大課學好,把C語言學好,然後再去選擇其他程式語言。一步一步的來,不要急。”

最後給大家幾個忠告來結束本文吧:

  1. 多交流:不管你的技術多麼硬,你都不可能一個人做完所有的事情,你要學會與別人合作,與別人交流。交流過程中,要注意交流技巧。學會尊重別人,但要不亢不卑。
  2. 多動手:熟能生巧,這是萬能之理。我們乾的是技術活,最能證明自己能力的就是幹!不是扯淡!
  3. 多思考:不要做編碼機器。
  4. 多總結:相同的問題不可能只出現一次,尤其是在我們這個行業。總結是為了你在以後更快的解決類似的問題,提高工作效率。
  5. 多分享:分享的更多,你會得到的更多,相信我。
  6. 多閱讀:多聆聽:不要僅限於技術,你要了解的不只是技術。同樣的問題,聽一聽別人是怎麼想的,怎麼思考的,你會得到更多。
  7. 永遠不要做拿來主義:沒有人有義務幫你搞定問題,不要張口就要,給你你很幸運,不給你也不是別人的錯。

 

文末彩蛋:

1.CSDN學院助學會員:僅需百元- 1300門課+600次下載特權,一次購買,全年無憂!點選檢視。

2.CSDN學院知識週刊:每週更新學院優惠課程活動及精品上新內容,點選檢視!