如何高效的學習C++?
@vczh
有一定的c語言基礎,應該這樣去學習c++?啃透 的書以提高效率嗎?
轉自一畝三分地論壇
http://www.1point3acres.com/bbs/thread-189903-1-1.html哈哈哈,大家都是勸JAVA的多,確實JAVA性價比高啊。
我提供一條線吧,針對C/C++,以及針對LINUX後端伺服器開發和分散式系統開發這條線:
0. 斯坦福的《編程範式》課程,百度一下,很多資源1. 《c++ primer》1個月刷完第一遍,做課後習題,答案看《C++ primer習題集》2. 《Effective C++》1個月刷完第一遍3. (可選)《CSAPP》的Tiny web 瀏覽器實驗(這個其實更多是C,但是還是建議做一下,原因後面說)(1個月)4. 跟MIT 6.824 2012年spring的分散式系統課程,做完它的lab,學習其代碼。課程主頁:https://pdos.csail.mit.edu/archive/6.824-2012/index.html (2個半月)4a.(可選) 拋棄lab中助教提供的框架代碼,自己實現一套完整的tiny distributed file system(2個月)5. 陳碩大牛的《Linux多線程服務端編程 使用muduo C++網路庫》,刷書+練習,認認真真的分析學習muduo網路庫 (2個月)
6. 第3、第4、第5步中遇到的問題,去針對性看《C++ primer》和《Effective C++》中相對應的章節7. 學習過程中好好利用GOOGLE、STACKOVERFLOW好啦,到這裡,大概C++理論算入門再往深一點點的水平,也有一定的C++的代碼量啦,個人感覺刷刷題,找工作也沒啥問題了。大概的時間列出來了,好好評估下吧。
說一句哈,真要走C++這條線的話,就別把自己局限到C++中啦,也把C給學啦,看看《APUE》、KR的《C語言》,會非常有幫助的。
我自己走完4這一步啦,感覺很爽。主要是自信心提上來啦!以前總覺得自己編程菜雞,遇到分散式那個作業時一度打退堂鼓,但是堅持下來,發現自己是有能力去完成這種看起來「無法完成」的任務的,現在遇到任何難題,真的再也不怕!就是干!當然啊!!!如果現在時間不夠的話,千萬千萬不要鑿C++啦!!
@足跡 :陳碩那本書前言中說過,讀者最好讀過unp,apue等書再來讀他的書,所以答主是不是把unp之類的書加上。我學c++的情況和題主相似:有一定c基礎,然後用C++ Primer 學c++。感覺效果還挺好的。
有c的基礎應該比較容易理解編譯器和機器執行的邏輯。
如果做過大型的規範的項目應該對c的一些特性:比如強類型檢查,函數調用的開銷等。c++上都有改進(重載函數,in line 函數)等。
但是如果沒有面向對象的語言知識的話,一些概念可能會比較難理解。c++ primer,我覺得是本很不錯的書。經常被人詬病的是,沒有講具體編譯器的使用,而是更多的關於語言本身的細節。我恰恰因為這一點買的這本書。還有就是被說太啰嗦,西方人的專業書基本都是這個風格,我個人很喜歡這個風格。要是搞得跟論語似的,微言大義,靠自己悟,我會瘋掉的。不過這本書不太適合速成c++。
另外個人以為,即使只用c的程序員,看看這本書也會有很大的提升,很多c++的想法在c裡邊也可以實現了。
祝題主享受c++,享受這本書。不存在可以「高效」學習 C++ 的方法
不要光啃,C++需要不斷地練習
我的經驗是跑去學php。
先說下我怎麼學的:
0基礎起步的,甚至之前沒接觸過電腦,大一第一學期開的C++,用的正是被大家黑出翔的譚浩強的教程,如同天書,理解不了就全背下來,計算機不會用,都是用紙筆寫下來,找電腦熟練的同學幫忙輸入電腦驗證或者自己二指禪輸入,不過正是這段經歷造成我現在的代碼編譯錯誤極低;那時候經常遇到一些煎熬,印象深刻的是期中課程設計,讓寫個非遞歸的二叉樹遍歷,扣了大概一周才弄完;之後把Effective C++和More Effective C++看完,更確切的是半背半理解吧,稍微不那麼迷茫了,但基本上只是學上掌握,還是用不起來,直到把C++沉思錄啃完和演算法導論上大多數東西用C++實現了一遍才開始有些信心
再之後就是大二結束開始接了些項目以及出去做兼職,慢慢積累…再說下現在我怎麼帶人的:現在招進來的人基礎都比較紮實,也多多少少自己做了些東西,所以都是先學規範,然後分兩部分,改現有項目的BUG和做一些小的模塊,只提大需求,其他的需求分析,流程圖,文檔,依附關係都自己一併搞定,三個月試用期結束,基本上都能上台階多寫代碼,少刷zhihu..
我同意輪子哥的觀點。C++需要不斷的練習比如構造函數初始化列表初始化的順序和在內存中聲明的順序。即使你當時看書,做實驗記得了,只要你一段時間不用,你估計就忘了。還有模板的一大套,單靠寫幾十行的學習代碼根本不能掌握C++。最好的辦法就是實踐,比如寫個異常安全的List,這個時候各種best practice就出來了,而且你被坑過,被編譯器折磨過後印象會更深。學習C++最好的辦法就是不斷地實踐,不斷地挖坑。
我認為,Rust基本上代表了C++的best practise。先學Rust。等你Rust學好了,要麼C++已經和Rust差不多了,要麼C++已經倒閉了。
每個從事C++開發的朋友相信都能給後來者一些建議,但是真正為此進行大致總結的很少。本文就給出了網上流傳的對C++編程開發學習的50條建議,總結的還是相當不錯的,編程學習者(不僅限於C++學習者)如果真的理解了這些建議,相信能夠在學習時準確的抓住側重點,少走彎路。下面列出這50條建議:
1、把C++當成一門新的語言學習(和C沒啥關係!)。
2、看《Thinking In C++》,不要看《C++編程思想》。
3、看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因為他們很難而我們自己是初學者所以就不看。
4、不要被VC、BCB、BC、MC、TC等辭彙所迷惑--他們都是集成開發環境,而我們要學的是一門語言。
5、不要放過任何一個看上去很簡單的小編程問題——他們往往並不那麼簡單,或者可以引伸出很多知識點。
6、會用Visual C++,並不說明你會C++。
7、學class並不難,template、STL、generic programming也不過如此,難的是長期堅持實踐和不遺餘力的博覽群書。
8、如果不是天才的話,想學編程就不要想玩遊戲--你以為你做到了,其實你的C++水平並沒有和你通關的能力一起變高--其實可以時刻記住:學C++是為了編遊戲的。
9、看Visual C++的書,是學不了C++語言的。
10、浮躁的人容易說:XX語言不行了,應該學YY;——是你自己不行了吧!?
11、浮躁的人容易問:我到底該學什麼;——別問,學就對了;
13、浮躁的人容易說:我要中文版!我英文不行!——不行?學呀!
14、浮躁的人容易問:XX和YY哪個好;——告訴你吧,都好——只要你學就行。
15、浮躁的人分兩種:a)只觀望而不學的人;b)只學而不堅持的人。
16、把時髦的技術掛在嘴邊,還不如把過時的技術記在心裡。
17、C++不僅僅是支持面向對象的程序設計語言。
18、學習編程最好的方法之一就是閱讀源代碼。
19、在任何時刻都不要認為自己手中的書已經足夠了。
20、請閱讀《The Standard C++ Bible》(中文版:標準C++寶典),掌握C++標準。
21、看得懂的書,請仔細看;看不懂的書,請硬著頭皮看。
22、別指望看第一遍書就能記住和掌握什麼--請看第二遍、第三遍。
23、請看《Effective C++》和《More Effective C++》以及《Exceptional C++》。
24、不要停留在集成開發環境的搖籃上,要學會控制集成開發環境,還要學會用命令行方式處理程序。
25、和別人一起討論有意義的C++知識點,而不是爭吵XX行不行或者YY與ZZ哪個好。
26、請看《程序設計實踐》,並嚴格的按照其要求去做。
27、不要因為C和C++中有一些語法和關鍵字看上去相同,就認為它們的意義和作用完全一樣。
28、C++絕不是所謂的C的「擴充」--如果C++一開始就起名叫Z語言,你一定不會把C和Z語言聯繫得那麼緊密。
29、請不要認為學過XX語言再改學C++會有什麼問題--你只不過又在學一門全新的語言而已。
30、讀完了《Inside The C++ Object Model》以後再來認定自己是不是已經學會了C++。
31、學習編程的秘訣是:編程,編程,再編程。
32、請留意下列書籍:《C++面向對象高效編程(C++ Effective Object-Oriented Software Construction)》、《面向對象軟體構造(Object-Oriented Software Construction)》、《設計模式(Design Patterns)》、《The Art of Computer Programming》。
33、記住:面向對象技術不只是C++專有的。
34、請把書上的程序例子親手輸入到電腦上實踐,即使配套光碟中有源代碼。
35、把在書中看到的有意義的例子擴充。
36、請重視C++中的異常處理技術,並將其切實的運用到自己的程序中。
37、經常回顧自己以前寫過的程序,並嘗試重寫,把自己學到的新知識運用進去。
38、不要漏掉書中任何一個練習題--請全部做完並記錄下解題思路。
39、C++語言和C++的集成開發環境要同時學習和掌握。
40、既然決定了學C++,就請堅持學下去,因為學習程序設計語言的目的是掌握程序設計技術,而程序設計技術是跨語言的。
41、就讓C++語言的各種平台和開發環境去激烈的競爭吧,我們要以學習C++語言本身為主。
42、當你寫C++程序寫到一半卻發現自己用的方法很拙劣時,請不要馬上停手,請儘快將餘下的部分粗略的完成以保證這個設計的完整性,然後分析自己的錯誤並重新設計和編寫(參見43)。
43、別心急,設計C++的class確實不容易;自己程序中的class和自己的class設計水平是在不斷的編程實踐中完善和發展的。
44、絕不要因為程序「很小」就不遵循某些你不熟練的規則--好習慣是培養出來的,而不是一次記住的。
45、每學到一個C++難點的時候,嘗試著對別人講解這個知識點並讓他理解--你能講清楚才說明你真的理解了。
46、記錄下在和別人交流時發現的自己忽視或不理解的知識點。
47、請不斷的對自己寫的程序提出更高的要求,哪怕你的程序版本號會變成Version 100.XX。
48、保存好你寫過的所有的程序--那是你最好的積累之一。
49、請不要做浮躁的人。
50、熱愛C++!
1)還是要打好基礎,C++和C還是很不一樣的,C++ Primer的習題要好好做,在電腦上要編程序試一下,多練練。2)搞點小項目,自己練練手,實際的使用會讓你大大提升能力,github上有不少,可以參考別人的寫法。3)多讀讀高手的代碼。深入學習一下C++,比如Effective C++等書籍。
我分享了兩本書.去研究吧.
http://pan.baidu.com/s/1eSdWD8Y?adapt=pcfr=ftw
http://pan.baidu.com/s/1nvcwtYh?adapt=pcfr=ftw
書不在多,而在精.最好能戒知乎.
不要遇事就問.原來推薦的是這個網站.C++ reference
不過,我後一個文件,裡面將其下載,並將示例轉成中文了.做一個小中型項目,不考慮運行效率。遇到不會的就翻翻書。寫完以後已經掌握一部分了。然後開始優化代碼。lambda表達式,正則表達式,一通改。再看看設計模式,弄個架構出來,又是一通改。最後做完了你c++就超過知乎大部分人了。接下來通過github上下載源碼,把各種輪子拆了看。要超過高手,除了大量的訓練外,還需要一定機遇去接觸好的項目。
清華自動化系,大一暑假的小學期兩周搞定C++......每天有小作業,還有期末考試(平均分60多)and要一周寫完大作業(鐵路售票系統),連續好幾天熬到3點多血拚......So有壓力就能學好,唉...
說些自己的對於C++感受。
首先說明自己的職業,並不是互聯網那些,而是機器人相關專業,稍微與嵌入式系統有關。
明白一件事,我覺得這件事對於學任何的東西都非常重要,
1. 學它幹啥的。
我雖然還是學生,但是教課過,教過無數人關於C++,總體來說,很多人根本不知道它是用來幹嘛的,或者我能用他幹嘛。就是覺得學的有用, 確實,有一個很重要的現實,我們在學習某些枯燥的知識(因人而異)的時候,確實不知道他是什麼幹什麼用,比如當年你學習數學矩陣時候有啥用,當時我不知道,我只是知道很好玩,後來做圖像處理,做動力學,才知道這些都是必不可少的,對於矩陣有了從新的認識。所以這是第一點,你學了語言一定不要忘了,你為了幹啥,說為了找工作也可以,當然說是為了人生升華,很大了。比如你想完成某個軟體等等。
2. 精髓在哪裡
幹啥都有核心,就比如演算法都是有幾個關鍵的幾個公式,或者幾個核。所有的東西都是圍繞這個事情展開。任何事情如果不這麼做,肯定做不好。語言也是。C++也有核心。圍繞這個核心去學習C++。無論你看什麼書,當然書有好有壞,前幾樓都有推薦,都不錯。
我們天天說面向對象,這到底什麼意思,繼承,覆蓋,多態,重載,模板等詞語到底什麼意思,我們怎麼用。當我們想去完成目標時候,如何使用這些精髓更高效的做好呢。
3. 東西都是人造的,
東西都是人想出來的,別人能想出來,就說明,那肯定是按照人的正常思維做出來的。通常這麼想,人總是想出來一個生態系統。這個生態系統肯定是正常運轉的。當創造者創造出來C++的時候,肯定也這麼認為,那你需要按照這樣的思維去學習C++.
4. 課後題很重要,更重要天天寫代碼
C++不是學了考完就完了, 你要用,很簡單,天天寫幾百行代碼,或者閱讀代碼。這樣才會有提高。我舉個例子我們機器人一個系統代碼可能是幾萬行,或者十幾萬行。你就看。網上源碼那麼多。為啥不看,為啥不學習。天天看著課後題那麼枯燥。
扯B扯的遠 說點C++實際的。
重點
Const 引用 指針 這三個傢伙配對使用,你能搞懂,說明你上了台階。
構造函數 析構函數 有好多種用法,不僅僅你想的那樣
多態重載覆蓋 C++精華所在
模板 如果寫程序開始必不可少了模板,說明你的水平就是算是可以。
如果感覺自己牛B壞了,就是看源碼,看STL boost 這樣庫的源碼。我看了一部分,果然都是大佬寫的。很多很好的機制,很不錯。
推薦一本書,C++之父寫的。C++程序設計語言
「既然可以忍受痛苦,那就不需要「高效學習」這種低效的東西了。」—@不鳥萬如一
個人覺得BJ的《C++程序設計原理與實踐》可能更適合入門,primer可以當做簡單工具書。我個人的經歷是primer看的時候,練習都會,過了一段時間用不上就忘了,之所以推薦BJ的這本的一個原因就是他以一個程序的實現為主線,來講解各種知識點,可能不如primer那麼全面,但是效果也許更好一點。不論怎麼說,都要多造輪子,問老師要項目,寓學於樂,還能賺兩個小錢,何樂不為。
先佔個坑。
雖然你可能已經不在知乎了,但是還是有可能在的。
先點個贊吧,我的贊太多了,還是需要你
cpp有個 手下總是多事,就是指針。於是圍繞著指針就搞出來一堆智能指針來。繞來繞去的,整出一堆大佬來,千萬別信他們。他們方向出了問題。只能將錯就錯了。最後就是他們讓萌新轉向java了。因為什麼?不為什麼。
你說,什麼設計模式那些東西,還搞出個ace。你再看看boost的asio。。後來的協程加入後,依然看起來就是厚厚的一坨。各種括弧+大佬們新造的辭彙。組成了棉花套子。看來他們的代碼,我覺得中文是相當好學的語言。
一上某sdn,就是這幫人。翻譯的比機器好一些。給的例子,只能比官網稍微好一點。
因為我知道,他們後來都轉行了。
再逛一下度娘的cpp吧,趕緊快過不下去了。不用打,直接散了。
這就是cpp的現狀。
有人說我說話沒邏輯?我問你,你是程序員嗎?請用程序員的邏輯跟我說話。你再看看我的邏輯是不是比你好很多呢?
怎麼高效的學習。你要知道 模板,宏,這些東西都是危險品。你操作的時候,一定要在實驗室,帶著各種輔助工具來操作。
那麼剩下那堆東西,std,boost 這些東西。勸你少碰。這些東西用完之後,你直接可以轉行java了。
為什麼?因為,他們希望java的人可以轉回cpp,可是貪嘛,
有批人,老學究,非得覺得cpp是萬能的。必須要人腦 直接跟cpp對話,來完成 瞬息萬變的用戶需求。他們做不到,但是他們說這就是cpp,不能取巧。
為什麼不給cpp做編輯器,做代碼生成器,給模板做輔助器?
為什麼?因為他們是cpp語言本身的開發者。他們不以人為本。
知道這些了。你學cpp應該就很高效了。因為很多東西看起來跟c有些像了。
攪局者Qt,我覺得這貨出來以後,是救了cpp。它的代碼,我感覺就是代碼生成器,利用模板生成器來生成的。全套基本都是自動化。弄了個qmake,很好。
先寫到這裡,慢慢來,沒有贊啥的,可能就真就只有這些了。
C++在主流語言中應該屬於比較難學的吧(我覺得objc更難學),學的時候東西比較繁多,我個人認為除非你過目不忘,否則這本書小節後的練習題一定要做。
如果你有不錯的編程基礎,可以選擇性地去做。
然後就是不斷寫代碼,最近葉大出的JSON教程可以作為C++學完後練手的項目~(當然他是拿C寫的教程例子都敲一遍 debug下
準備學習c++,共勉
學習c++只有沉下心來,共勉
推薦一個網站,我最近也在學。百度learncpp第一個就是,那個手冊寫得非常好。例子非常多,行文的順序也很好,做足了鋪墊,從淺入深。不足之處,是全手冊都是英文的。可能難以理解點。
推薦閱讀:
※有哪些能炫技的代碼寫法?
※如何寫優美的c++代碼?
※為什麼C/C++相同內存布局的struct不能互相cast?
※程序員應該將精力放在研究編程語言本身還是用編程語言創造好的軟體?
※Google對C++的影響有多大?