如何高效學習並掌握現代C++?
眾所周知,現如今進化到C++17的這門語言已經是一個相當現代化的語言。但網路上,尤其是在中文社區泛濫的教程,仍然以老舊的語言特性為主,請各位大佬給2017年的C++學習劃個重點。回答不限於語法特徵,可以包括參考書籍、IDE、最佳實踐等等。
我主要是寫Python的,工作中需要寫Python的C擴展,但C++並沒有很系統的學,寫出來的C代碼,自己看著很不舒服,故有此一問。或者說其實也沒啥捷徑,按照《C++ Primer》《Effective C++》之類的路線刷一遍?
懂得其他編程語言但沒(系統地)學過 C++ 一般是推薦 [1],最高效學習 C++11/14 使用上要注要的地方肯定是 [2] 了,才剛知道 [3] 在上月出了第二版,覆蓋 C++17 內容。詳細學習路線可參考 miloyip/game-programmer 第二部分。
[1] Lippman, S. B., J. Lajoie, and B. E. Moo. "C++ Primer, 5th edition." (2013).
[2] Meyers, Scott. Effective modern C++: 42 specific ways to improve your use of C++ 11 and C++ 14. " O"Reilly Media, Inc.", 2014.
[3] Josuttis, Nicolai M. C++ Templates: The Complete Guide, 2nd Edition. Addison-Wesley Professional, 2017.
C++之父給你的C++學習建議:學習&<現代&>的C++
CppCon2017: Bjarne Stroustrup 「Learning and Teaching Modern C++」
@31:30
@44:20 Modern C++
@50:00 Code examples
@1:07:00 QA
@1:32:00 Operator Overloading
如下是微軟關於C++的一個比較全面的講座:
C++: A General Purpose Language and Library Jump Start
據我所知,其中的主講人Kate Gregory是第一個發現平常的C++的教學中存在諸多問題,並倡議學校應該教授現代的C++的人,她應該是在十幾年前就倡議了 (笑
直到最近四五年,Bjarne Stroustrup 才意識到大勢不妙,許多編程語言(比如Rust、Go、JAI)想要取代C++的地位,C++的基本盤有動搖之勢,趕緊寫了一本《A Tour of C++》給初學者。
地址如下:
Stroustrup: A Tour of C++
《C++ Primer 5th》
《Effective C++》(部分條款過時)《More Effective C++》(部分條款過時)
《Effective STL》(部分條款過時)《Effective Modern C++》《Inside The C++ Object Model》(關注設計原則,而非編譯器的具體實現)勤上http://www.cplusplus.com查閱你沒把握的特性或介面各位說的很好,但是似乎沒人提到c/c++鏈接模型?我覺得這種知識也是必要的。比如說,什麼時候需要顯式具體化一個模板?這方面的書我讀的不多,只能推薦一個《程序員的自我修養--鏈接,裝載與庫》
認真反覆閱讀《C++ Primer》《Effective C++》就是最高效的學習途徑。
找個人給你code review
首先放上最近我最喜歡的快速成材材料
Presentation Materials: Overview of the New C++ (C++11/14)
Effective系列作者Scott Meyers做培訓的時候用的PPT,售價29.95刀。
梅叔保證一直更新,但是也可以自行谷歌出一大把免費PDF鏈接。
然後贊同Milo Yip和Kouei的回答並附上我的個人學習經歷。
作為一個熟悉CLR的.NET工程師,因為需要我從7月開始按順序啃掉了下列原版
《C++ Primer (5th Edition)》
《Inside the C++ Object Model》
《Effective Modern C++: 42 Specific Ways to Improve Your Use of C++11 and C++14》
《Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition)》
《Effective STL: 50 Specific Ways to Improve Your Use of the Standard Template Library》
《API Design for C++》
接下來是它們
《C++ Templates: The Complete Guide (2nd Edition)》
《C++ Template Metaprogramming: Concepts, Tools, and Techniques from Boost and Beyond》
《C++ Concurrency in Action: Practical Multithreading》
我的思路除了讀原版書之外,還有一下幾點
- 問為什麼
- 紮實掌握C++98/03是紮實掌握C++11的前提條件
- 接受並沿用C++的思維方式,並與已有的其他思想、經驗嘗試交叉結合
- 書上寫的並不總是正確的,所以要常備errata、StackOverflow和cppreference.com在手邊
- 刻意練習
祝好運。
Practice.
And practice more.幹嘛這麼想不開,學什麼不好,學C++……
一路下來,感覺學習編程語言的套路都差不多。
(1)入門學習:programming in xxx,簡明xxx
(2)深入學習:深入淺出xxx,effective xxx
(3)標準跟進:the xxx reference manual,the xxx standard
對,要想學習現代C++,最新的C++標準最好手頭有一份。
另外,題主有時間的話,可以去省級或者國家級圖書館去看看,真的很好用,興許還能淘到很多寶貝。
將《c++ primer》書中習題與例題練習一遍。
如果突出「現代」兩個字的話,Scott Meyers有一本《Effective modern c++》,主要是C++11和C++14。(其實我也才看兩章2333,就斗膽來推薦了,他比較善於總結錯誤用法,例如auto推導vector&
PS:好像只有英文版,讀的可能會稍微慢一點
學習的話,建議rust。
實際使用,看公司怎麼要求的,目前尚未聽說哪家公司,在團隊中使用C++17(個人做輪子,封裝好了給其他人用的不在此例)推薦閱讀:
※learn python the hard way 習題13運行問題..?
※為什麼人們會崇拜一個編程語言?
※程序猿怎樣才能修鍊到負責一個真正意義上的項目?
※學好編程可以幹什麼?
※C 語言中 int main() 和 void main() 有何區別?