下面首先對學習C++的問題進行學習探討,C++這們語言太靈活了,它支持過程化程序設計、數據抽象、面向對象程序設計、制作圖標等等泛型程序設計等多種程序設計風格。
首先我們先要知道一點,學習C++是一門什麼語言?簡單點來說,C++是一門接近於全能的語言。為什麼說是接近呢?因為C++有一門語言是無法取代的,那就是匯編。再直白點來說,匯編對於寄存器的操作,C++是無法勝任的。不信?你試試用C++來改寫一下PC寄存器看看?沒轍吧?
"接近"可以理解了,那麼"全能"呢?我們知道,C++是兼容C的。不嚴謹地說,我們可以簡單認為C只是C++的一個子集,所以C能做的,C++也能做,這個應該沒有人有異議。為了方便,以下所描述的C++,在某些方面也代表C,之所以沒采用C/C++這樣的寫法,僅僅是為了保護鍵盤而已。轉回正題,那C#呢?JAVA呢?它們所能做的,比如網絡方面的應用,B/S的方方面面,怎麼就沒見C++的身影呢?
關於這個問題嘛,我們從另一個角度來看,C#和JAVA的運行基礎是什麼?沒錯,是虛擬機。虛擬機是用什麼寫的?嘿嘿,C++。所以,你完全可以用C++先寫一個虛擬機,然後再在虛擬機上解釋C++語法。是不是很酷?
當然,我想現實中是不會有人那麼去做的。就像從深圳到上海,你可以坐飛機去,也可以騎自行車去。兩者都能到達目的地,但我估計沒幾個人會選擇後者。這就是效率問題。坐飛機,眼一睜一閉,就到了;騎自行車?呃,這時間就不好估計了。所以這領域,該讓C#的,或是JAVA的,就讓它們去折騰吧。至於C++,就讓它干在一旁瞪眼好了,除非你一定想要耍耍酷。
接著,我們就來看看桌面應用吧。所謂的桌面應用,我們狹義一點,就是桌面應用程序。總的來說,目前在這領域,C++確實還能占有一席之地。但這僅有的一席之地,也岌岌可危。在XP之前,因為系統都是沒有預裝.net framework,所以C++的對手無非就是VB和DELPHI,但這兩者根本無法撼動C++這顆大樹。雖然XP也能裝.net framework,但為了一個應用而弄一個體積如此巨大的玩意,卻有那麼一點點的不現實。
但後XP時代,世界就不一樣了。Vista已經預裝了.net framework,更不用說Windows 7。甚至還有傳言,Windows 7的用戶界面就是用C#搞定的。何況,C#還有殺手锏,能和Silverlight完美結合,大大減輕UI的開發難度。看起來,在今後的日子,在這個桌面應用領域。
C++日子過得並不舒坦。在這領域,可能C++還能耀武揚威的,也許就剩下大型的3D游戲了。雖然用.net配合OpenGL或Direct3D也能做C++的事,但效率卻會大打折扣。雖然隨著硬件的不斷提升,可能這折扣會不斷縮小,但畢竟還是存在的。只要折扣存在,那些游戲廠商就不會放棄C++,因為能優化,為何不優化?但,也許也僅僅限於此了。C++,它淚流滿面。
最後呢,就是嵌入式領域。在這裡,是C++的天下,C++是永遠的王者。它不是一個人在戰斗!此刻,它靈魂附體!你見過那些RTOS是用C++以外的語言寫的再次重申,正如前文所說,這裡的C++也代表了C)?
至少我印象中沒有。嵌入式linux支持.net?除非微軟的腦袋秀逗了。也許有人說,WinCE不是可以支持.net麼?支持是可以支持,但並不代表所有的WinCE設備都支持。因為WinCE是可裁剪的操作系統,也許是為了節約內存空間,也許是為了啟動速度,或是由於別的雜七雜八的,甚至莫名其妙的理由,很多廠商根本就不會將.net這個會將系統膨脹至少4M的組件加到產品去。
看看WinCE的內核代碼,看看WinCE的BSP包,哪裡有.net代碼的身影?全部清一色的C++。甚至於WinCE的應用程序,微軟的態度也非常明確,在桌面只能.net使用的Silverlight,在WinCE SP3添加之後,卻是更改為了C++接口。王者,絕對的王者,根本就不可能有別的語言在這裡將C++撼動!此時,C++站起來了!腰板直了!
說了那麼多,那麼我們的最後,就來看看為什麼大家都說學好C++難吧。如果你對學好C++沒啥興趣,以下的文字估計對你也沒啥營養,你可以完全忽略不計,可以很愉快或很氣憤地將當前網頁給咔嚓掉。
其實學習C++很簡單,但難就難在這個"好"字。初學者會發現,入門很簡單,因為C++也沒啥語法;但搞清楚語法後,接下來就犯糊塗了,下一步應該怎麼走呢?只所以產生這種原因,是因為C++太靈活了。對於一種功能,C++有各種各樣的方法,究竟什麼方法才是最合適的?
比如說,傳遞給函數的形參,什麼時候該使用指針,什麼時候該使用引用?就連平常得再也不能平常的指針轉型,有C的括號形式,還有C++特有的dynamic_cast和reinterpret_cast,究竟哪個才是該使用的?更不用說分配內存了,既有malloc,還有new,如果算上STL的話,還有一個resize。我想所有的這些,對於初學者而言,如果他看著這些能夠腿不痛腰不酸,那麼我強烈佩服這人的淡定力。
C++還有更讓初學者郁悶的是,即使不用STL,不用類,不用虛擬繼承,甚至不用C++的一切特性,也是能夠完成所相應的功能。所以,疑惑了,C++是什麼?也許這時候,很多人就會想,如果選擇是唯一的,那是多麼地幸福啊!因此,很多人就轉向了C#或別的語言),因為對於某些操作,方法是唯一的;即使不是唯一,也沒有C++那麼繁多。
沒打算在這論述該如何學習C++,因為一千個人有一千種方法,而這一千種方法,還不一定適合你。但有一點是共通的,那就是多看書。將市面上經典的C++著作,仔仔細細地消化,相信一定能達到爐火純青的地步。即使達不到吧,也沒事,不會作詩也會呤吧?只是,這時候意志力就非常重要,當然也需要那麼一點點情商,要相信沒有邁不過的坎。