有人說c語言已經過時了,學程式設計應該從面向對象語言開始。在這一點上我持保留意見。
1、關于c語言的學習
在linux下,大部分的程式還是c語言實作的。win32 api仍然是用c語言實作的。
windows平台c++應用廣泛是微軟力推的結果,但是現在windows平台應用軟體的開發,有向c#偏移的趨勢,這要看vista系統推行的效果。到時候,恐怕大家又要跟風似的去學習c#了。作為初學者,不要盲目地去追時髦,到頭來吃到苦頭的永遠是你自己。就像c#,當你剛剛熟悉2.0版本以後,3.0版本已經問世了,又要勿勿忙忙搭上3.0的列車。。。時代在不斷進步,技術在不斷發展,我們要明白我們真正要學的基礎是什麼?就像實體學一樣,在沒有學習經典力學之前,就想學習最新的相對論思想,這可能嗎?
不管c++、java、c#怎麼發展,不管windows平台青睐于哪種開發語言。c語言仍然是程式設計入門語言的首選。過早的接觸面向對象,會讓你忽于對計算機底層的了解。沒錯,程式設計首先是以人為主,然後才考慮機器.但是,隻考慮人,而完全不考慮機器是大錯特錯的,那會導緻你為所欲為,以為自己想到的,計算機就一定可以實作。然而,事實告訴我們,事情并不是我們想的那樣.
在編譯器層面上,c++的實作最終仍然會被展開為c形式的,完全沒有封裝的代碼。程式,最終還是要在機器上運作。隻有面向對象,而沒有c基礎,在了解計算機底層技術的時候,還是要回過頭來學習c語言的程式設計思想的。
美國在使用java等面向對象語言作為入門語言幾年之後,現在已經又重新考慮使用c作為入門語言了,原因,正如我前述所說。
此外,linux倡導的程式設計藝術是簡單美。在今後相當長的時間内,linux平台下的軟體開發還是以c為主,當然,不排除kde界面是用的c++,web開發使用java。
至于程式設計思想的發展趨勢,現在c++積極提倡泛型程式設計的概念,這與面向對象是完全不同的概念,也是程式設計思想的一次革新。泛型同面向對象的結合,可以産生良好的效果。java和c#等面向對象語言也跟随其後,提供了對泛型程式設計的支援。但無疑,c++在泛型程式設計方面是推進得最好的。
2、c++的學習
建議學習c++從《c++ primer》等經典外國名著入手,使c++的學習完全不依賴于平台。
畢竟,c++最先是在unix系統,在貝爾實驗室提出來的。隻是在windows上得到了發揚光大而已。
一開始就輕視語言本身的學習,過早陷入mfc類庫,會讓你不能了解c++語言的真谛,寫出的c++代碼隻能是c式的c++,這也是國内很多c++初學者常走的彎路。
c++社群的大牛們現在都推薦把c++當作一門全新的語言來學習,完全與c差別開,使程式員不再寫c式的c++代碼。
c++發展了二十年,已經不是簡單添加了類封裝的c語言了。如果你依然這麼認為,那麼你對c++的認識還停留在上個世紀80年代。
然而,我在上面又說學習要先打好基礎,那不是要從最初的c++思想學起嗎?确實,我們應該了解c++的曆史,這對于我們了解這門語言非常有用。但并不是要你抱着80年代的c++書籍埋頭苦讀,而是伴随在moder c++的學習過程當中。c式的c++相對于modern c++有太多的缺點,我們幹嘛不學最好的方法呢。就像實體學一樣,其中的經典理論也經過了由錯到對的過程,那麼,我們還要從錯誤的思想開始學習嗎?學習c語言,我們也要從ansi c未出現之前學習嗎?當然不是,基礎,并不代表就是陳舊的東西。
但是,在國内,c++标準庫的使用并不廣泛,很多人對c++的使用依然停留在對c代碼的簡單類庫封裝上。這是很可悲的。還好,從2000年開始,大量現代c++名著被引入國内或者翻譯為中文版,越來越多的人開始接觸modern c++。
國内的c++社群,也湧現出了侯捷、榮耀、劉未鵬等少壯派高手。
還是那句話,學習c++一定要看國外名著,譚浩強、錢能的c++書還是放到一邊吧,他們在誤人子弟。
c++大牛們推薦首選使用stl标準庫,因為它與平台無關,而且抛棄了c語言中的種種缺陷和陷阱。但是人家沒有推薦mfc之類。
充其量,mfc,現在我隻用來做界面架構,因為自己用sdk敲界面架構實在太麻煩了。然而mfc并不是唯一選擇,wtl、qt都是不錯的界面庫。而且,實際上mfc的封裝模式早已跟不上c++的步伐,要知道mfc推出時,c++仍未标準化。然而mfc卻沒有跟着c++的發展不斷重構自己的類庫,實際上mfc基礎架構根本沒有什麼大的變化。
而現代c++類庫,如stl、atl、wtl、boost、ace、loki等等,都充分結合了泛型和面向對象的優點,是現代c++的完美展現。mfc類庫,我承認,其中仍有許多東西值得我們學習。但是針對c++的設計思想來說,他的架構已經過時了,它仍然停留在對c語言的api簡單封裝的層次上,到處是稀奇古怪的宏代碼。這是不值得我們再學習的。
至于程序和線程等底層處理,則直接使用api,即可以提高運作效率,又對于你認識作業系統很有幫助。
在代碼的整體風格上,應該使用modern c++。在算法和資料處理上,盡量使用stl。隻有使用到作業系統api的時候,才使用c語言。當然這其中有個c++代碼與c語言api互動的問題,其實很簡單,主要發生在vector和string上。
最後,學習程式設計關鍵在于學習思想,不要禁锢于語言的細枝末節上。
c語言是程式設計的基礎,c++的泛型思想可謂是程式設計思想的尖端、潮流。
在掌握基礎之後,學習頂尖的設計思想,就如同輕車熟路一樣,非常輕松。
個人觀點:
風格是修養,文法是外功,算法是内功,練好這3種才是真正高手!