一個實用主義者的觀點:如何學習使用C++
國內C++譯作圈比較出名的就這幾個人,劉未鵬PongBa,自從進入微軟以后好像更加關注心智方面的研究,關于C++的文字幾乎就沒了。孟巖 http://blog.csdn.net/myan 也是很久沒有新博客文字,也少見C++方面的內容。榮耀,好像也是非常低調。最出名的莫過臺灣的侯捷老師,他現在忙于企業培訓,估計沒啥時間寫新文字。這 些人里面關于C++最新標準的,還是劉未鵬在07年寫的C++0X漫談。
07年啊!!那時候房價還沒有這么高!!物價也沒有這么高!!!車也沒有這么多!!!路也沒有這么堵!!搞C++的程序員你傷不起啊!!!
瞎扯一下,回到正題: (一個初學者)如何學習以及使用C++。
看完coolshell的文字,以及劉未鵬曾經寫過的《學習C++:實踐者的方法》http://blog.csdn.net/pongba/archive/2007/12/11/1930150.aspx
可以發現他們都傾向于這樣一種個人覺得并不很好的方式:列書單。
我在《漫談C語言及如何學習C語言》也列書單,但不僅僅列書單。一個初學者光靠看書,只能完成學習過程中30%甚至更少的進度。
想學好C++,能真正把C++用起來,必須要讀、寫、看、說多種手段多種方法結合使用。
另外我個人對C++的態度,就是不要學習使用它的全部,把它的基礎部分掌握了就好,足夠用了。比如模板元編程這種高級話題,初學者不要牽扯過多,以免一葉障目不見泰山。學編程是干嘛的?如果是為了使用,那就學最核心最基本的那些好了。
在你學習C++之前,先明確自己的目的,為什么要學C++?為什么要用C++?可能是大學老師要你學,可能是公司開發項目需要你學。如果沒有目的沒有需求,不要用學習C++來折磨自己了,學點英語,學點Python編程都比學C++好玩有用多了。
學習C++之間,還需要準備一下練習環境。我這里偷一下懶,在《漫談C語言及如何學習C語言》http://sunxiunan.com/?p=1661 這里提到的開發工具全都支持C++開發,所以你在里面選擇一個安裝就可以了。在Windows下開發,我建議大家安裝VC2010和SP1(怎么搞到?別 問我,問迅雷吧),新版本雖然有些慢,但是支持Win7操作系統,對C++標準支持更好。不是像有些人說的2003到2010沒啥變化,這種人估計從來不 看release note吧?!至于VC6,還是拋棄了吧。
還有一點想羅嗦一下,C++最好不要作為你的第一門編程語言,選擇C語言更適合。首先是你在C語言中學到的東西,基本上在C++都可以用,包括一直 遭人唾罵的MACRO宏。另外C語言入門級好書很多。而C++入門級好書不好選。如何學習C語言,看我《漫談C語言及如何學習C語言》吧,用心點的話,大 概需要半年到一年時間就足夠了。
第一階段,讀書。
建議大家先一次買齊下面5本書,其他書籍不對初學者推薦:
stanly lippman的《C++ Primer》
《Effective C++:改善程序與設計的55個具體做法:第3版 》
《C++標準程序庫—自修教程與參考手冊》侯捷孟巖翻譯
《More Effective C++:35個改善編程與設計的有效方法(中文版)》
《C++編程規范:101條規則、準則與最佳實踐》
第一本書非常難選,我這里建議幾個候選者,讀者可以到書店去翻看一下,哪一本覺得合口味就用哪一本。
候選者A,錢能老師的《C++程序設計教程(修訂版)–設計思想與實現 》 http://product.china-pub.com/46574
我上學的時候,翻過錢能寫的C++書,感覺還不錯。至于這一本實話實話我沒看過,但是按照國人教學風格應該是一板一眼的。
候選者B,stanly lippman的《essential C++》,這本書我有,但是感覺不適合作為初學者使用,如果你有一兩年編程經驗,看看這本書也許還行。
候選者C,stanly lippman的《C++ Primer》,基本上用這本書入門,應該是比較花費時間的,但也很正統,這本書買了肯定不白瞎。
我推薦A+C,或者你到圖書館選擇隨便選一本《C++設計教程》作為A的替代,先知道一下皮毛。
初學者階段需要注意的是,每看完一段,都(必須的!)要自己做做上機實驗,把章節后面的練習,文章中的代碼示例,自己動手把程序敲進去,編譯一下,運行起來,調試調試。這一步非常重要,如果你做不到,那就學不好。
至于IDE如何調試,如何設置斷點,如何建立、配置項目,不屬于這篇文字范疇,但有問題的話,歡迎留言,我會盡量解答。
C++包含幾個方面范式,一個是傳統的結構化編程,一個是面向對象程序設計,一個是基于模板編程,還有就是STL標準模板庫的使用。
讀者可以按部就班,先學習結構化編程,主要掌握基本的程序語法、關鍵字、數據結構,比如const的使用,4種xxx_cast概念等等。
面向對象編程,要數量掌握class、new、delete,對象(資源)管理,對象生命周期,構造、析構、拷貝構造、拷貝賦值這些與對象實例相關 的內容,了解一下多態、繼承、重載、覆蓋、operator重載這些內容。另外簡單了解一下多重繼承、異常處理機制等等概念。寫寫例子實現一下,其實都不 難理解。
模板方面的內容,不要挖的太深,了解并且實驗一下如何定義模板類模板函數偏特化這些基本知識就夠了。我可能用的比較淺,但是我八年工作經歷來看,模板的內容屬于不常使用的。
STL方面,掌握幾個基本的類型比如vector、list、map、set、string,了解一些基本算法,比如find之類,基本上工作就足夠了。
在這里要推薦第二本C++必須有的書籍《C++標準程序庫—自修教程與參考手冊》侯捷孟巖翻譯。這是一本必須放在手邊的書籍,因為MSDN關于STL的內容寫得真是太爛了,比其它內容差的太多太多。前面介紹的STL,有了這本書在一邊輔助,有問題一查便知。
我一直在提的就是了解基本就足夠了。沒錯!對于初學者而言,千萬不要想著什么都學什么都會。C++的內容太多陷阱重重,什么都想知道,只能是胡子眉 毛一把抓。抓主干抓基本抓核心,對我提到的內容,注意不同的層次:掌握、熟悉、了解,這些內容多看看,其它的碰到了在深入學習。
C++第三方library,比如boost,如果沒有必要,不建議大家學習和使用在自己的項目中。當然也有例外,比如asio和boost-python都是最近風頭很勁的庫,做網絡編程或者配合python的話,可以選擇。
如果對于C++基本語法以及common knowledge有了認識了解,下面需要增加的就是工程實踐設計方面的內容,基本上大家都推薦這幾本,我也不例外。
《Effective C++:改善程序與設計的55個具體做法:第3版 》
《More Effective C++:35個改善編程與設計的有效方法(中文版)》
《C++編程規范:101條規則、準則與最佳實踐》
這三本書的風格都是條目式,內容很實在,不玩虛的不炫技,里面的內容都可以立刻用在工程實踐當中。
另外需要說明的是,純粹C++知識對于實際編程工作是不夠的,必須結合特定領域,比如Windows下編程你要知道SDK API,Linux編程你要知道常用的system call,數據庫編程要知道一些如何連接查詢更新的步驟。這些沒法在這里一一介紹,可以咨詢公司內的其他同事,或者留言給我好了。
看完這幾本書,可能你對C++的了解已經上了一個臺階,這時候就不要繼續死讀書了,該動手做點什么了。
第二階段,寫代碼。
書讀百遍其義自現,代碼寫的多,bug就會多。開場詩念完就講講如何寫代碼。這其實是非常難的一步,有不少朋友書讀了很多,但是就是寫不出一行代碼,或者寫出來的還是非常奇怪充斥著低級錯誤的代碼。這就是熟練度不夠的緣故。
平時喝茶的時間拿出來,想想代碼該如何設計;平時泡妞的時間拿出來,想想這個函數有沒有更好的實現;看到winzip、迅雷、QQ,想想如果自己寫該如何實現功能。不僅要想,還要動手做一做。
如果你是做Windows編程,這里推薦一下codeproject.com,這個網站上的項目設計了Windows開發的方方面面,比如GDI如 何操作,數據庫,控件菜單窗口消息循環等等,都比較短小精干,而且都包含了整個項目代碼下載(而不僅僅是某個片段),下載以后編譯調試一下,會對自己提高 幫助很大。
現在坊間也有一些step by step的書籍,教你如何一步步實現某個功能,這種書可以根據書評銷量選一本然后照著實踐編程。
第三階段,看高人編程。
這一步針對讀者已經工作而且公司中有高手存在的情況。跟高手拉好關系,然后坐在一邊看他編程,一般有些人不喜歡別人看,但是如果你表現出很仰慕的表情,問題應該不大。一般比較靠譜的軟件公司對于新人都會指定一個導師,如果幸運的話,你就看你的導師如何編程好了。
其實這是學徒到大師中很關鍵的一步,有個詞叫”傳幫帶“,就是師傅手把手的教。其實編程也是一門手藝,如果沒看過師傅真實的工作狀態,想變成高手要比較困難一些。
看高人編程看什么,看他如何寫代碼,如何思考,用了哪些工具、快捷鍵,遇到問題怎么調試怎么跟蹤的?這些都是書本上很少見,但是工程實踐中又非常有用的東西。
第四階段,分享知識。
自己水平夠不夠,一做分享就知道。
不少公司都會定期舉行技術分享會這類活動,或者有些地方社區也會搞搞技術分享。如果你覺得自己學的差不多了,就試著把自己知道的講出來,分享給其他人。
這樣做有幾個好處,一個是增加你對知識的了解。我做過不少ppt,當自己想說點什么的時候才知道自己有多深淺哪個地方還欠缺,這個辦法萬試萬靈。在 問答環節,你還可以與其他人互動,其他人的問題未必你都懂,這時候就可以繼續深入學習。另外可以增加你自己的技術知名度,是一個很好的廣告效應。
如果沒有類似的技術分享怎么辦?
我建議讀者注冊一個stackoverflow.com的賬號,到那里去回答問題,一樣也是非常好的分享方式。
原文鏈接:http://www.cnblogs.com/lua5/archive/2011/03/31/2000786.html
【編輯推薦】