C++ 的“武”和“功”

來源:互聯網
上載者:User


練武不練功,到老一場空。

練功不練武,十年白辛苦。

 

這是我當年看電視劇:《霍元甲》時聽到一句話。“功”是指身體素質、內力、“武”是指招式、套路、章法。

練武不練功,是指光有一些招式華麗,基本功卻不行,一推就倒,所以到老一場空。

練功不練武是另外一種情況,苦練一身肌肉,體內真氣盈溢,差不多就是金剛不壞之身了,可惜手上招式一點不會,拿刀不會砍,拿槍不會刺。記得當初郭靖身體素質很好,但他於降龍十掌中只學會了一招“亢龍有悔”時,出手就來這一招,搞到自己累得要吐血,對手還莫名其妙(我跟你有血海深仇嗎?)。修行十年,內力深厚,卻打不過人家,所以叫“十年白辛苦”。

 

學習編程,比如學習C++,確有不少人,要麼光練武,要麼光練功。比如有人說他會C++。一問,才知道是會VC;再一問,才知道會MFC,好吧,雖然Bjarne Stroustrup一提到MFC就皺眉頭,那你註冊個視窗類別吧,這人說,我只會用VC的嚮導產生一個視窗。再比如,有人說他有3年的C++使用經驗,於是問他下面兩個函數是否構成重載:

Code:
  1. void foo(int );  
  2.   
  3. enum Week {...};  
  4.   
  5. void foo(Week ); 

 很乾脆地回答他從來沒用過枚舉,還加了一句:“enum 有用嗎?人家java語言剛開始時,就故意拋棄了它。”我想說後來java 1.5不又加上了enum?再一想討論這個沒意義,就問他:“那你總得有個辦法來產生一個可讀的符號,比如宏啊,常量啊?”。他說“直接用字串多好啊~”,刷刷地來了一段:

Code:
  1. string fruit = "Apple";  
  2.   
  3. //...  
  4.   
  5. if ( fruit == "Apple")  
  6. {  
  7.   
  8. }  
  9. else if (fruit == "Pear")  
  10. {  
  11. }  
  12. else if (fruit == "Peach")  
  13. {  
  14. }  

“有什麼可讀性問題嗎?”他問我,“而且,需要時,還可以直接把它輸出到螢幕,很方便調試呢!”。(如果他要問我:你是怎麼輸出一個枚舉值呢? 哎哎,我會慚愧得不好意思說,自己一直都要為特定的enum類型,臨時寫個 operator << 的重載。 )

 

說到字串,又想起另一個執行個體。有個類庫,它提供一個鏈表介面類:IList。只是介面類,存不了什麼具體的元素。如果要想存放整數,就自己實現一個IntegerList吧,如果想存放學生資訊,那該是“StudentList”。不過考慮到“字串鏈表”太經常用了,所以類庫已經實現了一個“StringList”。在這裡面,懂得如何使用StringList,算是一種“武”,而懂得如何規劃所需的衍生類別,那算一種“功”。但有個光愛練武者,他覺得,既然手頭已經有一個“StringList”了,還何苦去寫其它List呢?不管是Integer,還是Student,反正他通通先拼成字串存入,需要時再取出來,拆分、轉換回來。我批評他,他回我一句,這種“以不變應萬變”的最高境界,你是不懂的。隔數天,我在一個評論C#的“裝箱/拆箱”的貼子上,我看到他積極的身影,正在義憤填膺地痛訴萬惡的box機制是如何如何的低效率。:) 真是一個可愛的哥們。

 

《白話C++》課程中提到,程式設計語言的發展,從朝著“機器友好”向“人類友好”的方向發展。在此發展過程中,無論從哪方面看,C語言(而非C++或更後來的語言)都是最成功的語言,其中一個方面就是,C在給程式員一個直觀的“語言介面”的同時,它依然直接地對應了機器結構。僅管電腦的運算速度在變得越來越快,但它的結構卻沒有根本性的變化,還是馮·諾依曼結構。所以很多國外IT教育者認為程式設計專業的學生,必須從C語言學起。

這就是我想說的第一種“功”:瞭解機器。我們在PC上寫程式,而不是在床上寫程式,所以最好我們還是應該對PC的結構有所瞭解。再接下來,如果我們是在圖形化使用者介面上寫程式(GUI),那至少該瞭解一下最常用作業系統 Windows。包括訊息機制、GDI資源、記憶體管理、進程間通訊。別因為它是M$的產品就鄙視人家,因為天下GUI一大抄呢。如果是在Linux下進行GUI編程,同樣是這些:訊息、GDI、記憶體、進程通訊……哪個差得了? 這是我們說的第二種“功”:瞭解作業系統。如果你還只是初學者,那直接面對這兩樣是有些難,那最後一樣“功”,C++語言本身,你總得練好了,在我看來,這可是“童子功”,在你思想最單純,在你還不需要養家糊口的時候,練好它吧。

 

接下來說另一個極端了,那就是“練功不練武”的問題。哎呀,相比“光練武”的通常都頭頭是道,振振有詞;換到這個方向上,苦大仇深的人,自動找上門的人可就多了!

“老師啊,我整本《C++ Primer》,都學了啊,可我始終只會往一個黑黑的視窗上列印一些字元……我會迴圈,會條件分支;我理解抽象、理解鎖裝與多態;我擰得清重載和覆蓋、擰得清is a和has a,擰得清公有派生和私人派生……對為什麼類模板可以特化而函數模板不可以之類的問題,我已經從語言根底上瞭解它的來龍去脈……可是,為什麼還是什麼也不會,我想要的,什麼也寫不出來?”

 

是啊,我知道你要什麼!

你不過是想透過網路,調用一下google或yahoo提供某個提供天氣預報的Web Service介面。

你不過是想把公司財務軟體匯出來的某個有著嚴格xsd定義的,XML格式的報表,拿來解析一下。

你不過是想把深夜下載的一些小說,壓縮一下,再加密一下。

你不過是想在Windows的案頭上,驕傲地運行一個自己寫的小程式,用來定時或不定時地提醒你:該站起來扭扭腰了啦;

你不過是想在玩別人遊戲玩累的時候,動手寫個俄羅斯方塊自己爽YY一下自己;

你不過是發現自己每天的工作都是固定地往公司規定的Excell文檔裡填寫一些有點規律的數字,所以你想自己寫個程式來操縱Excell。

你不過是想在市裡精神文明辦在網上評先進小區時,協助街道大媽大爺想個法子,試試能不能作弊,讓程式自動“點擊”投票。

你不過是想為你當教師的老媽媽,寫個成績管理程式,不過是想訪問一下資料庫,讀點資料,寫點資料,統計點資料。

你不過是想寫個有點灰色的程式,假裝自己是傳說中駭客,很友情地嚇一嚇網路上的某個MM。

你不過是想玩下Linux下,到那裡面也寫一個有視窗的,有個按鈕的程式,最好按一下那個按鈕,還會彈出一個訊息框,上面寫著“Hello Linux.”相當於Linus的世界裡,留下一個“到此一遊”。

你只不過是想用C++語言寫一個多線程的例子,試試如何用多線程搶頻寬。

……

這一切,《C++ Primer》都沒有教啊。因為,《C++ Primer》是用來教你如何練童子功的啊。它不教你具體的一招一式。你想再進階看C++之父寫的《TCPL》,那是另外一本練功書,它們負責教你金剛不壞之身,至於那些使用C++打造出的其它十八般武器,如何個玩法,它們不教。

怎麼辦?來上我的課唄!等著捧場一下我寫了足足8年的書:《白話 C++》。

得先說一下,我們可能真正打了非常好的“功”以後,才開始學習“武”嗎?

當然不可能,也完全不應該,想要成為戀愛專家,卻堅持不和女人上床,我以為那隻能培養出某一流派的哲學家。想要成為武林高手,卻花了50年光用來練馬步,真是相當不可取。練一陣子功,再習一陣子武,習一陣子武,再回頭練更高層次的功,比較現實,並且肯定可以相互促進,相得益彰。

我會用直白的方式,深入地講解一些基礎知識。比如,有些人,一知半解,看到下面的測試代碼時,一下子“心神不寧”的:

Code:
  1. if (0.5 == 0.5)  
  2. {  
  3.    cout << "yes" << endl;  
  4. }  
  5. else  
  6. {  
  7.     cout << "no" << endl;  
  8. }  

  他們說:“好像,好像浮點數不能直接比較啊”。這類人,就是對“基本功”不太紮實的,只知道浮點數不好直接判斷相等,卻忘了這世界上,是先有浮點數,然後才有電腦。

  我還會告訴你:既然有了if/else時,為什麼還要有swith/case,還是和浮點數有關啊!

  我不會直接教你物件導向,相反,我會讓你愛上一個女人一樣,愛上“面向過程”,然後厭煩了“她”,終於你遇見了另一個她:“物件導向”。和愛與不愛一個女人之間的相同的地方是,這都是你的需求;而不同的是,你通常是因為感情或肉體愛上另一個女人,但我要你因為理智而愛上物件導向。

   這些都是“功”,“武”呢? 我會講STL裡vector,list那麼純粹的東西,但我也會講boost::thread。誰說C++裡沒有跨平台的線程來的!我還會講wxWidgets,它是通行於多個平台(win, linux, mac)下的圖形化使用者介面庫,完全的C++代碼,雖然它被用於ruby,python,甚至java等語言...我還講xerces-c,這一套強大的XML庫。想要把一個有著xsd限定的XML文檔,與C++的struct資料直接產生映射,別以為只有C#做得了噢!想要拿到一個wsdl就可以直接透過網路訪問遠在地球另一端的WebService呢?gSOAP幫你搞定一切,相容性之高,java等語言無法望其項背。想要寫一個有著不錯的顯示效能,並且能跨平台的遊戲?我留了一點點章節講解SDL,如果你等不及,為什麼現在上YouTube,搜尋一下關鍵“SDL”呢?

 

   上我的網站:www.d2school.com看看已經發表的課程,我忘了說一點,學習C++和學習其它語言,最大的不同,就是:“耐心和細心”。先按《準備》章節的課程,好好準備那些庫的安裝吧。
 

   最後,是不是等著買一本《白話 C++》就夠了?當然不是,我不想找罵。從我開始接觸C++,這15年我個人在編程書籍花的錢,沒有上萬,也得有7,8千元----你肯定不用買這麼多書,因為當初沒人教我如何學習C++,自然沒有教我該買哪些書。我走了很多彎路,花了很多冤枉錢,不應該讓新同志重犯。前面說的《C++ Primer》還有TCPL都是強烈推薦您買的。再有的,我的書的最後一章它會開出不少書籍,不僅僅是C++的,還有作業系統相關的,資料庫相關的……

 

   好了,這就是我的第一篇筆記。老王賣瓜自賣自誇是難免的。但此時,在此處,我一個學生也沒有,急嘛,眼紅嘛,貼個招生啟事不違法吧?人家電視購物上,候總叫得比我好多了。

 

-------------------------------------

如果您想與我交流,請點擊如下連結成為我的好友:

http://student.csdn.net/invite.php?u=112600&c=f635b3cf130f350c 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.