如何學習C++

來源:互聯網
上載者:User

本文來自:http://www.perfect-is-shit.com/2012/12/11/how-to-learn-cpp/

感謝作者的總結

關於本文

  1. 讀者定位是兩類人群:a.初學者,即將入手 C++ 語言、不知道如何開始;b.已經開始學習C++許久了,卻進度緩慢,抓不到精髓,倍感迷茫。
  2. 本文不會深入到C++語言內部挖掘技術點。
  3. 如果你自詡C++高手,請繞道;如果你本就是C++高手,開發經驗豐富,可以對本文提一些建議。
  4. 本文將結合我自己的學習經曆和經驗,談一談 C++ 應該如何學習,以及擴充到編程領域的一些想法和看法。
  5. 文章中提及書籍的時候沒有評價。我的書籍推薦中列舉了一些 C++ 書籍,都有我的相關評價,感興趣的可以看一看。


本文

為什麼 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》。其實好書和差書很容易區分,厚度和價位是一個很關鍵的點,通常薄薄的,又便宜,書名卻非常霸氣的告訴你如何精通,那你果斷扔了,想都不要想。

選擇一個好的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++ primer》,《C++標準程式庫》,《C++ template》
  • 多思考,多寫小程式。
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. 結交自己的技術圈子。
C++高手(走出C++)

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

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

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

如何成為高手?
  • 看書 《物件導向分析與設計》,《設計模式——可複用物件導向軟體的基礎》,《泛型程式設計與STL》《C++模板元編程》等。
  • “實戰->感悟->總結->實戰->感悟->總結……”如此迴圈
C++腦殘粉(回首C++)

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

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

如何成為腦殘粉?
  1. 看書。《C++語言的設計和演化》
  2. 搜集野史。

好了,總結了這許多,我個人理解的 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語言

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

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

  1. 學習這些電腦體系大課,你腦中的體繫結構已經和你學的 C++ 融合到了一起,你腦中的類是存在記憶體中的,你的遞迴是在棧中不斷的壓棧,而他的只看到的是代碼。這也就是為什麼我不贊成你培訓機構的原因,培訓機構不會教會你這些學科大課的。他只會告訴你C++的函數是怎樣聲明的,類要怎樣書寫,而這些 100 塊錢買一本書,坐著看幾天都學會了。何必花那麼多錢去培訓。
  2. 多寫代碼,多調程式。培養錯誤的感知能力。
  3. 學會挖掘,多思考。

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

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

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

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

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

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

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

能說的還有很多,讓部落格待續……

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.