C和C++的學(xué)習過(guò)程總結
總是被同學(xué)們問(wèn)到,如何學(xué)習C和C++才不茫然,才不是亂學(xué),想了一下,這里給出一個(gè)總的回復。
一家之言,歡迎拍磚哈。
1、可以考慮先學(xué)習C.
大多數時(shí)候,我們學(xué)習語(yǔ)言的目的,不是為了成為一個(gè)語(yǔ)言專(zhuān)家,而是希望成為一個(gè)解決問(wèn)題的專(zhuān)家。做一個(gè)有用的程序員,做一個(gè)賺錢(qián)的程序員。我們的價(jià)值,將體現在客戶(hù)價(jià)值上,而不是語(yǔ)言寫(xiě)得好不好看。
C++是C的一個(gè)面向對象的解釋?zhuān)?a class="contentlabel" href="http://dyxdggzs.com/news/listbylabel/label/C++">C++為C擴充了大規模工程應用,復雜的系統結構的組織和掌控方法,但是,我認為,C++骨子里還是C的。
畢竟,解決具體問(wèn)題,每個(gè)函數內部,都是用C的方式寫(xiě)程序,還是面向過(guò)程的。
因此,想要學(xué)習好C++,我的建議,先學(xué)習C,先學(xué)解決問(wèn)題的能力,再討論解決大問(wèn)題的能力。就是先學(xué)習怎么走路,再學(xué)習怎么跑步。
2、學(xué)習C的過(guò)程中,一定要理解結構化編程思維。
為什么呢,我前面有文章說(shuō)過(guò),軟件語(yǔ)言的發(fā)展過(guò)程,就是一個(gè)數據私有化的過(guò)程,大型工程應用,強調高內聚,低耦合,模塊化設計,保持代碼最大的靈活性和安全性。
這是現代工程化開(kāi)發(fā)的核心和靈魂。
因此,利用C這門(mén)語(yǔ)言入門(mén),借此理解結構化開(kāi)發(fā)思維,可以說(shuō)是個(gè)很方便的路子。因為C的函數,本來(lái)就是為重用做準備的。同時(shí),全局變量和cpp內部私有變量的差別,其使用原則,這些都能學(xué)到很多結構化開(kāi)發(fā)思維。
3、開(kāi)始學(xué)習C++
C++不難學(xué)的,很多人覺(jué)得C++難學(xué),其實(shí)是因為它在C之外,又提供了很多的概念,尤其是對象,很難以理解。
不過(guò)我經(jīng)過(guò)這么多年,把這個(gè)問(wèn)題反而看淡了,我認為面向對象相對面向過(guò)程,僅僅是結構化程序設計的一個(gè)具體體現,是編譯器提供手段,強迫程序員必須遵循數據私有化的一個(gè)實(shí)例,C++和C的關(guān)系,最核心的莫過(guò)于此。
現在我們回到C再看看,如果我們把一個(gè)全局變量,寫(xiě)到一個(gè)cpp里面,并且在對應的h文件中不聲明,它是不是就只有這個(gè)模塊可以使用?它是不是就是私有變量,以這個(gè)理解,類(lèi)能明白了嗎?
4、學(xué)習C++的深入技巧
C++在類(lèi)的基礎上,經(jīng)過(guò)這么多年的發(fā)展,其實(shí)提供了很多深入的概念,看起來(lái)很復雜,其實(shí)我看也很簡(jiǎn)單。比如模板,我的理解就是“類(lèi)的類(lèi)”,大家說(shuō)是不是?
既然模板理解了,STL,ATL這些,靜態(tài)模板庫,動(dòng)態(tài)模板庫,還難理解嗎?就是一大堆類(lèi)的類(lèi),可以借此實(shí)現很多應用中需要的類(lèi),不需要程序員再自己寫(xiě)而已。
ok,STL都理解了,泛型開(kāi)發(fā)還難嗎?所謂泛型開(kāi)發(fā),其實(shí)就是我做一個(gè)模板,來(lái)定義一套算法規則,但是呢,我希望這個(gè)算法規則,能進(jìn)一步抽象,對核心數據類(lèi)型不要限死,我把各種數據套進(jìn)去,都可以用,這樣,僅算法這部分,我不需要重寫(xiě)了。你想想是不是這個(gè)道理?
學(xué)到這里,C++和C,其實(shí)已經(jīng)差不多了。再學(xué)語(yǔ)言,就是求全責備,過(guò)于鉆牛角尖了。
5、學(xué)習應用開(kāi)發(fā)
前面說(shuō)了,學(xué)習語(yǔ)言,目的不是讓別人認為自己是專(zhuān)家,是為了寫(xiě)程序賺錢(qián)。因此,語(yǔ)言學(xué)完,要學(xué)習應用開(kāi)發(fā)。
什么叫應用開(kāi)發(fā)呢,我會(huì )一門(mén)語(yǔ)言,但是,客戶(hù)不懂,客戶(hù)說(shuō)的很直接,在Windows下給我寫(xiě)個(gè)程序,我要什么什么功能。為啥Windows呢?因為我習慣。
OK,很多時(shí)候,應用開(kāi)發(fā)要尊重客戶(hù)習慣,一般說(shuō)來(lái),語(yǔ)言這個(gè)東東,還是要結合具體平臺的開(kāi)發(fā),才能開(kāi)發(fā)出有意義的應用程序賣(mài)錢(qián)。那么,一般說(shuō)來(lái),客戶(hù)端是Windows系統,服務(wù)器是Linux,這些都是行業(yè)習慣,嵌入式不好說(shuō),各種平臺都有,Palm,S60,Linux,WinCE,等等。要根據自己的目標客戶(hù)來(lái)定。
當我們選定目標平臺后,有一個(gè)問(wèn)題,選什么語(yǔ)言,很多時(shí)候,學(xué)生和商用程序員差別就在這里,學(xué)生一般沒(méi)得選,自己會(huì )啥就用啥唄,企業(yè)里的程序員不會(huì ),要先評估需求,看哪個(gè)語(yǔ)言更合適,不會(huì )的語(yǔ)言,要去學(xué)。
ok,假定我們選了C和C++,那么,我們需要選擇開(kāi)發(fā)平臺,Windows下不用說(shuō)了,VC,這是最好用的,Linux下呢,gcc,其他的也差不多。
假如我們開(kāi)發(fā)VC,并且使用C++,這個(gè)時(shí)候,才需要考慮學(xué)習MFC了,因為這是微軟的標準類(lèi)庫,至少Windows平臺下,它最權威,你看見(jiàn)沒(méi)有,我們從學(xué)習開(kāi)始,走了多少步,才走到MFC?是不是MFC不是學(xué)習C++上來(lái)就必須學(xué)的?
6、學(xué)習MFC
學(xué)習MFC,很多人一上來(lái)就開(kāi)始看其體系架構,看得一頭霧水,那個(gè)模塊關(guān)系依賴(lài)圖,我到現在都看不懂。
呵呵,其實(shí)不是啦,和學(xué)語(yǔ)言一樣,我們學(xué)MFC的目的,也不是希望成為MFC的專(zhuān)家,而是要利用MFC開(kāi)發(fā)Windows應用程序,為我們賺錢(qián)??匆?jiàn)沒(méi)?MFC是手段,不是目的,目的是開(kāi)發(fā)Windows程序。
其實(shí)Windows下,有一套很標準的C接口,叫Win32API,這個(gè)才是Windows的標準編程核心,因此,學(xué)習MFC,真實(shí)的目的是理解Windows程序開(kāi)發(fā),建議可以先學(xué)習Win32API,看來(lái)我們又回到C了哈,呵呵。剛開(kāi)始學(xué)C有用吧?
7、Win32API
其實(shí)Win32APi不難學(xué)的,因為雖然它很大,有很多接口,但不是必須的,我們真正做個(gè)簡(jiǎn)單的Windows應用,其實(shí)用不到這么多的。做個(gè)簡(jiǎn)單的Dialog,然后實(shí)現個(gè)功能,你遇到的接口函數,其實(shí)絕大多數,就是以后常用的了。把常用的記熟練,就ok了。
關(guān)鍵是,這個(gè)時(shí)候要通過(guò)WinMain方式,去理解Windows的事件機制,這是核心,其實(shí)說(shuō)起來(lái)簡(jiǎn)單得要死。就是以前你的程序,由于沒(méi)有系統支撐,很多事必須自己做,比如檢查鼠標和鍵盤(pán)輸入,你需要寫(xiě)個(gè)死循環(huán),自己不斷去看,而Windows說(shuō),這些事你不要做了,我來(lái)做比你好。你沒(méi)事就玩去吧,我把和你相關(guān)的消息放到一個(gè)隊列里,就是你的事件隊列,你自己沒(méi)事去找找看,有沒(méi)有新消息來(lái),有就做事,沒(méi)事就玩好了。很簡(jiǎn)單是不?
當然,Windows是多任務(wù)操作系統,有時(shí)候,我們的邏輯需要并發(fā)一些功能,比如說(shuō),我在等鼠標鍵盤(pán)消息的時(shí)候,需要再看看打印機準備好了沒(méi)有,這里就需要理解并行計算了,這和語(yǔ)言無(wú)關(guān),和操作系統無(wú)關(guān),這是另外一個(gè)話(huà)題,這里不多說(shuō)了,你可以自己找找線(xiàn)程開(kāi)發(fā)的相關(guān)資料看。
看見(jiàn)沒(méi),為了學(xué)習好Windows編程,其實(shí)我們不僅僅需要學(xué)習語(yǔ)言,還要學(xué)習操作系統,并行計算原理,內存原理,可能有時(shí)候還需要學(xué)習網(wǎng)絡(luò )通信,等很多知識,所以說(shuō),單憑學(xué)習語(yǔ)言,是成不了商用程序員的,一個(gè)合格的程序員,需要理解的東西,太多了,要廣為學(xué)習。
當我們把Win32API,以及基本的窗口化程序設計理解了,就可以回到MFC繼續學(xué)習了。是不是有點(diǎn)遞歸返回的意思?呵呵。
8、回到MFC
原來(lái)學(xué)MFC很難的,因為其封裝了太多細節,很難理解透徹。不過(guò)還好,我們有侯老師的深入淺出MFC,去找本來(lái)看看,如何從Win32API的純C編程,改變?yōu)镸FC的C++方式,看這個(gè)最快,基本上前6章看完,已經(jīng)會(huì )了,這里我就不多說(shuō)了。
9、COM
COM、COM、COM,我最頭疼的COM,呵呵。
COM就是一種遠程過(guò)程調用,即你請求的代碼是在另外一個(gè)進(jìn)程中運行的,通過(guò)某種通信協(xié)議來(lái)回傳遞參數和結果。僅此而已。DCOM進(jìn)了一步,服務(wù)者可以在另外一臺計算機上。在公司開(kāi)發(fā)中,大家可能各做一塊,如果要合作,Windows下建議多使用COM.(我個(gè)人喜歡socket通信哈)
簡(jiǎn)單說(shuō),COM提供了一種機制,可以跨進(jìn)程通信,甚至跨機器通信。不過(guò),為了傳遞各種類(lèi)型的參數,COM可謂是無(wú)所不用其極,它發(fā)明了智能指針,可以指向任何類(lèi)型的數據,同時(shí),為了實(shí)現智能指針,它使用了大量的C++泛型設計,看見(jiàn)沒(méi),C++的基本功就起作用了,還用到了ATL.
學(xué)習COM,要注意一個(gè)接口的概念。由于開(kāi)發(fā)者是不同的人,調用程序和服務(wù)程序,可能不是同一種語(yǔ)言,OK,不能簡(jiǎn)單提供一個(gè)C或C++的。h文件來(lái)解答接口,因此,COM提供了標準接口,使用者在程序內部,以查詢(xún)方式獲得可用接口,進(jìn)而以接口ID調用。很累人的。
學(xué)會(huì )了COM,就可以多理解一點(diǎn)ActiveX了,那么再學(xué)習一點(diǎn)dll(動(dòng)態(tài)鏈接庫)的知識,我們就已經(jīng)可以寫(xiě)OCX控件了。一般說(shuō)來(lái),OCX控件是個(gè)很好的設計,哪都能用,一個(gè)軟件的模塊,最理想是開(kāi)發(fā)成這個(gè)樣子,比exe靈活。
評論