標籤:

如何高效學習並掌握現代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&的iterator類型時會發生的事情)

PS:好像只有英文版,讀的可能會稍微慢一點


學習的話,建議rust。

實際使用,看公司怎麼要求的,目前尚未聽說哪家公司,在團隊中使用C++17(個人做輪子,封裝好了給其他人用的不在此例)


推薦閱讀:

learn python the hard way 習題13運行問題..?
為什麼人們會崇拜一個編程語言?
程序猿怎樣才能修鍊到負責一個真正意義上的項目?
學好編程可以幹什麼?
C 語言中 int main() 和 void main() 有何區別?

TAG:編程 | C |