這篇文章實際上是我自己入門過程的總結,一個儘量少廢話的C++入門指南。總結完忽然發現像個讀書清單?。
具體總結前,想先回答一個問題——要不要先學C,再學C++?
我作為小白時疑惑過這個問題,在此給後來的小白和當年的自己一個答案。
個人看法是,單就學習C++而言,直接學習C++就可以了,不用先學C。在知乎看到輪子哥在微軟維護STL的Stephen Thomas Lavavej都說他當年學C++之前學C語言浪費了大量的時間,早知道就直接從C++開始。
很多老的專案是C語言寫的,之後的程式設計生涯多半還是繞不開學C語言,不過那時候你已有C++功底,構不成啥大問題。
因此,這篇文章基本不提C的學習,直接硬剛C++。不贊同的看客勿噴,右上叉叉就是了。贊同的同學可以往下看。
入門
《Accelerated C++》,《Essential C++》二選一精讀。《A Tour of C++》選讀。
- 《Accelerated C++》很適合新手,因為她只有短短不到300頁,在普遍磚一樣的入門書籍裡面是一股清流。容易通讀完,減少挫敗感。就這樣的篇幅,還能涉及一些標準庫的使用,真的很適合入門。
- 《Essential C++》比較適合有其他程式設計經驗的中手迅速學習C++。內容會比《Accelerated C++》深一些。
- 《A Tour of C++》,C++ creator扛鼎之作,適合剛學完、還有學完很長時間以後看,快速複習 C++知識。
主看書的同時,輔以這幾個網站的資料,交叉印證——
- C++ 教程:www.runoob.com/cplusplus/c…
- 你好,C++:zhuanlan.zhihu.com/nihaoCPP
- C++入門系列部落格:www.jianshu.com/u/67702c00e…
(目的只是印證,別的資料也可以,網上多如牛毛,這裡只是貼了我當時看的)
我當初主看的是 Accelerated C++,在上下班通勤等零碎時間就在手機上看輔助部分的資料,看看跟讀書的理解一不一樣。甚至有時能意識到資料中某些概念的表述不太準確,此刻會發覺自己真的理解了。
這種交叉印證的閱讀法,有人問我有什麼必要?(看了幾個內容可能重疊的資料)。好處有兩個,一是能使自己入門時對基礎理解的自信更足些;二是,我沒見過哪本書或哪篇文章,可以從頭到尾完全清晰、毫無歧義的。交叉著看可以讓很多理解儘早明晰無誤。
完成這一步後,就可以開始上GitHub看點別人的程式碼,嘗試寫點程式碼。
我的話,學了在xcode下新建C++工程,然後參照這幾個連結,寫了兩個計算器和一個學生管理系統。然後開始搬磚了。
計算器1:blog.csdn.net/jiejinquani…
計算器2:www.zhihu.com/question/28…
學生管理系統:blog.csdn.net/qcyfred/art…
入門這一步是最關鍵的,你初步瞭解了各種基本概念,併成功書寫和執行起了程式碼,感覺真棒吧。
接著下面介紹的,就是順利入門以後的廣闊大海,慢慢慢慢慢慢慢慢、好好好好遊吧。留心,不要急,千萬不要抱有直接把後面的內容一口氣學完,再開始幹活的想法。因為那樣要耗費巨量時間且效果不好,況且C++是學不完的,也沒有人敢說精通。請一邊投入實作,一邊保持學習。
系統化
入門後有時間就要閱讀些更系統的書。
具體就是《C++ Programming Language》(現在已經有第四版了)和《C++ Primer》二選一精讀。之後有時間可以翻翻另一本。
(強調提示 !!!《C++ Primer》和《C++ Primer Plus》不是同一本書的不同版本,作者也不一樣。【不建議】看《C++ Primer Plus》)
函式庫
到這裡你應該跨過了語法障礙了,要開始瞭解函式庫。可以按順序看看《C++標準庫》、《深入理解C++物件模型》和侯捷老師的《STL原始碼剖析》。
追逐效能與優雅
現在應該對C++算有小小成,可能會對如何寫出更好效能、更優雅的C++程式碼感興趣,可以繼續看《Effective C++》和《More Effective C++》,《Exceptional C++》。
哲學
能堅持到最後這步,你可能快瘋了,瘋子喜歡問哲學問題,比如C++是誰、從哪來、要到哪去。
嘗試讀讀《C++沉思錄》、《The Design and Evolution of C++/C++語言的設計和演化》。
另外 C++(C語言) 在一眾高階語言裡面卻算是比較貼近計算機底層的語言。多瞭解計算機結構、儲存、運算原理方面的知識,會對C++ 的來龍去脈理解得更透徹,可以讀讀《電腦科學導論》、軟體工程的《程式碼大全》、作業系統的《現代作業系統》、程式設計師入門的《深入理解計算機系統》。
2018.10.12 更新
就對於Android開發者而言學習C/C++有沒有必要呢,怎麼結合起來呢? ——夜幕降流星雨 android開發 @ android
個人覺得必要性要看所在公司的業務領域和你的個人興趣。比如直播公司涉及的音視訊業務,必然是要涉及c/c++的(ffmpeg啥的哪有java程式碼);類似的需要c/c++的業務一般是些重效能、偏底層的東西。如果你判斷自己公司中短期都沒這個需要,那就輪到看自己有沒有興趣了。前景的話說句題外話,大前端慢慢侵蝕原生開發,慢慢單純的Android開發會被替代的,雖然過程應該很很很緩慢。一方面你也可以轉大前端,這樣比較快速;另一方面就是可以深入做這些偏底層的東西,沒那麼容易替代,但未來的事情誰又說得清楚呢,哈哈。
Android和C/C++怎麼結合起來?
可以搜尋ndk、jni等關鍵字瞭解,網上鋪天蓋地的基本教程。這個學會基本使用應該大家都沒啥問題,但是如果是更深入一點,比如具有明確功能的程式碼中,c程式碼是怎麼結構的,生命週期,怎麼跟android(java)配合等等,說實話,需要一個專案的實踐。這方面我有很好的思考之後會從小白0基礎的角度寫點文章。