原文地址:http://coolshell.cn/articles/4119.html
因為之前收藏的地址找不到了,所以重新發一下
昨天寫了一篇如何學好C語言,就有人回復問我如何學好C++,所以,我把我個人的一些學習經驗寫在這里,希望對大家有用。首先,因為如何學好C語言中談到了算法和系統,所以這里就只談C++語言。
- C++是最難的語言。這個世界上最難的編程語言可能非C++莫屬了。你千萬不要以為幾天就可以學好C++,C++的學習曲線是相當BT的,你可以看看這篇文章。C++是一門很自由的語言,自由到了有點BT和恐怖的地步。我甚至認為C++并不是一門成熟的編程語言,因為太容易犯錯了。所以,你一定要在一開始就要有很小心謹慎的態度,并把C++當成一種難以訓服的猛獸來看待。
- 多問“為什么要這樣”的問題。學習C++一定要多問幾個“為什么是這樣”,“憑什么要這樣”的問題。比如:很多人知道C++有拷貝構造函數和初始化列表,但你真的知道為什么要有拷貝構造函數?為什么要有初始化列表嗎?為什么要有template,為什么要有RTTI,為什么不是別的呢?難道就是為了讓一門語言變得Cool一些嗎?完全不是這樣的,C++中的任何一個feature都有些實實在在的原因,你一定要去了解為什么要把C++設計成這樣的原因,你才能學好C++。有空看看《C++演化和設計》一書。
- 看書,大量的C++書。你可以按如下先后順序閱讀(下面這些書,我花了大約4-5年的時間,今天我還在隨時溫習)
- 和Java語言做對比。我個人以為Java對C++這個并不成熟的語言做了很多調整,規范和限制。所以,對比一下Java和C++,想一想,為什么一些東西在C++中可以做,但在Java中卻不行。比如:Java的異常是必需要catch的,不然就會編譯不通過。為什么Java不提供操作符重載?為什么Java會引入接口來做多重繼承?為什么Java沒有像C++那樣的I/O字符流?為什么Java不支持指針?為什么Java可以做到垃圾回收?等等。Java體現著很多面向對象設計的東西,學習Java有助于你學會怎么更好地使用C++來編程。
- 面向對象設計 。雖然面向對象可能是個騙局。但是我覺得面向對象設計中的一些實踐非常的不錯,比如,單一原則,依賴倒置原則,等等,都非常地經典。《設計模式》必需一讀,《面向對象的分析和設計》可以一讀。但不可以設計模式為中心來編程,而應該是用設計模式來解藕。
- 類庫學習。看看MFC是怎么封裝Windows API的,看看ACE是怎么面向對象的,看看boost是怎么玩面向對象的,看看CPPUnit又是怎么設計的。當然,Java的JDK中有太多的設計模式,可以參考。
希望沒有嚇到大家,并歡迎大家補充。
—————更新 2011/03/30 19:20————
更新幾個觀點:
- 1)我不擅長寫書評,所以推薦的這些書可能會讓你有點看點沒有感覺,你可以上豆瓣或是China-pub上看看書評。
- 2)C++有很多奇淫技巧,有的很BT,包括虛函數表,也許會有人覺得有點沒意思,但我覺得很有意思,一方面可以了解一門語言的實現細節,另一方面可以開闊思路。我從學習這些知識中受益很多。
- 3)上述是我的個人的學習歷程,我覺得對我很有效,所以是經驗之談。
- 4)這類的文章在網上有很多很多,我不是第一個寫這樣的文章,我也不是寫得最好的,我并不希望用長篇大論來談論什么。只是想給大家了解一下大概的學習樣子。畢竟,C++博大精深,任何一篇文章都無法說好。不如就簡單一些。