曾 經因為自己的一些文章在網上引起了大家對C++學習和使用的討論,再回想起自己接觸C++三年多,一年前鼓足勇氣重新開始再次學習的情景,現在的我心中多 了幾份感慨,更多的是覺得自己學習的過程頗具普遍性,幾次想把自己的一些心得寫下來,對自己算是個總結和回顧,對別人即使談不上協助但相信也能算是個學習 C++的案例分析吧。但開始幾次提筆總是過於追求完美,想把所有的東西都寫下來,但幾次提筆和幾次放棄後,我終於打消了“完美”的這個想法,等一下還要和 自己女朋友打電話,就這一個小時內,能說多少算多少吧,畢竟我是說出來寫下來了。
接觸C++是在99年,那個時候自己已經 有一些C語言的基礎了,剛開始會用的關鍵字比起C來說也許只多了Class吧,那個時候在學校,也學了VC++,寫了幾個很簡單的遊戲程式,然後就因為很 多瑣事沒有再在C++上有更多的深入,這也是我現在非常遺憾的事情,也許那個時候我能夠投入進去,現在應該是能頗有小成了。
02 年開始了一個新的裡程,我自己有充足的來支配時間。就在那一年的暑假,開始了新的C++學習,我知道我以前的基礎對於學習C++來說,幾乎不會有什麼更大 的協助,所以我選擇了重新開始,從IF….ELSE這樣的文法開始。選擇的第一本書是好友友情贈送的《C++ PRIMER》,當時我只是看了不到三天,我就沒有繼續看了,我知道這本書非常不錯,但是肯定不適合當時的我,因為從一開始就有過多的東西給我困惑,類, 模板,重載……,這樣東西幾乎讓我放棄學習C++,因為我那個時候覺得自己C還是有一定功力的,就把C搞透對我來說那個時候也是個不錯的選擇,但畢竟C的 內涵無法讓我有更多的激情,重複的東西我向來就不喜歡。然後我開始考慮++這個兩種語言唯一的標示區別到底蘊涵著什嗎?同時我開始考慮到底程式設計語言是 什嗎?隨後我在圖書館借了本書《程式設計語言的概念和實現》,無論別人如何看待這本書但它卻讓我明白了很多,因為這本書最大的特點是抽象出了現代程式設計 語言的各種語義和其中蘊涵的思想,讓我對語言本身這個概念有了更深刻的認識,讓我建立去了各種語言自身的不同的文法都代表實現一種對於所有語言都共有的語 義,而一個富有邏輯的語義系列卻反映出了更一般的程式設計思想。在有了這個概念後,我接觸到了《C++設計與演化》這本書,在學習C++過程中這本書對我 的協助是最大的,這本書讓我明白了C++的設計理念和各種語言設施所代表的實現語義,既各種紛繁的C++語言特性都是為了實現某種功能並且在不違反C++ 設計哲學基礎上建立起來的。這樣的對於C++的宏觀基礎,讓我在以後的學習日子裡受益非淺,而《C++設計與演化》這本書我也同時具有中英兩種版本,每當 我對很多關於C++特性困惑的時候我都會把英文版(隨便炫耀一下,這本書上有B.S的親筆簽名:))拿出來,再好好的看看。就象前陣子對於C++的學習, 可謂討論頗多,我自己也再次把這本書拿出來,評價自己所持有的觀點是否正確。從此我認為自己算是走入了學習C++正確道路。
10 月B.S來到中國,那個時候的我對於C++可以說只是個完全初學者(呵呵,給大家舉個例子,那個時候我在杭州碰到了cber,他開始告訴我他的網名,我卻 說你的姓名是什嗎?後來他寫下他的名字和連絡方式我卻還不知道我對面站著的是個C++頂尖高手,幸虧那個時候的我還和他合影了一張相片,這算是我比較明智 的地方吧,至少沒有留下遺憾。)我雖然是個初學者,但我不認為我應該錯過這次和大師親密接觸的機會(尤其是在反覆拜讀過他的書和大部分論文後),自費來到 杭州(其實也花了不少那裡同學的錢:))聽了B.S在浙大的報告,我很早就去了,坐在第一排,整個報告會也是我第一個問問題,回想那個時候我的問題多少顯 的幼稚,但我告訴自己無論自己現在怎麼樣,這樣的機會一輩子也許不會有了,所以我始終保持了十分積極,B.S的回覆十分詳細以至與我到後面就基本處於假聽 的狀態:》但B.S的大師風範卻讓我顛倒,從此對於C++的學習我也不再功利。
學習就是積累,期 間我看過《C++編程思想》,又對C++有了更感性的瞭解,三個月後再次拿出《C++ PIRMER》,這個時候我已經能非常明白LIPPMAN這本經典大作的巧妙用心了,它絕對不是給初學者看的,但對於入門後完全的學習和理解C++效果卻 十分明顯,從書的一開始就直接進入C++的主題,前面五章都用類設計一個資料結構,讓讀者完全明白了各種使用者定義型別所代表的抽象能力,然後直接進入第六 章標準庫中的容器類,這樣的設計讓讀者十分清楚的建立容器和類這兩個C++中十分重要的概念,之後的學習自然是非常富有滿足感。以前學習編程的經驗告訴 我,寫程式才是學習的中心,所以並且我把《C++ PRIMER》中的大部分代碼都調試通過了,範例的代碼連貫性也是這本書的最大的特點,而另外一大特點就是代碼沒有一個是可以直接通過的,都需要自己的調 試,在調試這樣的代碼過程中更加深了我多C++的認識。不到兩個月的時間就把《C++ PRIMER》初看了一遍,加之在CSDN上面和大家的交流,感覺已經建立起了對C++的完整的基本認識。
沒 有看過《C++程式設計語言》,算是學過C++嗎?在我眼裡,如果連語言的創作者的書都沒有讀過,如何去理解這本語言?去年12月我花了整整一個月把這本 書好好的看了兩遍,唯一的感覺是這本書才是真正有資格稱為《C++編程思想》的。書和《C++ PRIMER》是完全的不同風格,後者告訴你的是完整C++的文法和其支援的語義。而前者是真正告訴你如何去用C++思考問題和編寫符合C++設計理念的 代碼。你能明白C++的設計理念極其理念下的程式設計思路和代碼編寫規範。到今年元旦,感覺自己比起當初已經是進步不小,所以沒有繼續看書,而是在寒假看 了幾個大點規模的C++程式原始碼。
之後,我也讀了一些C++大家的作品,在這裡需要提出來的是《C++標準程式庫》和《C++沉思錄》,前者寫作方式通俗易懂,但全書內容卻十分豐富,對於 學習標準庫可以說是最佳表現的作品。而後者,閱讀感覺和《C++程式設計語言》一樣,思想性非常強,讀這樣的書很累,腦子必須一直思考問題,思考作者裡面 提出的問題和他提出的解決方式。這本書最大的特點是非常直接的把C++語言的核心暴露出來-----三種抽象模型和極其語言設施本身對這三種抽象模型的支 持。而《C++沉思錄》給我的更深層思考是什麼才是運用C++最合理的方式,這也是後來我發帖說明自己對於C++的學習和使用的一些見解的原始思想來源。
再後來,自己慢慢的用C++實現了一些小程式,有的是書本上的,有的是自己想的,寫程式和調試的過程給我的感覺就是煩惱和滿足的交替過程也許就是這樣的反 複過程才是程式員追求的。文章至此,多數記載了自己的曆程,對很多看到這裡的讀者來說相信並沒有什麼協助,下面我非常直接的說出自己的學習C++感受,從 前面我的經曆大家都可以看的出來我不是什麼高手,但我保證我下面寫的東西對於初學C++的是十分有協助的,畢竟我剛剛走過那一段時的灰暗日子。
學 習C++重在理解其各種語言設施所代表的語義,以及C++所能表示的語義所代表的設計思想。首先從宏觀上入手,你需要明白的是C++是程式設計語言的本 質。在此我把C++最重要的性質寫下來:C++是一門靜態類型檢查,基於C記憶體模式,支援四種基本程式設計範型的語言。注意,這裡說明了三個本質特性,靜 態說明了語言的類型檢查性質,基於C記憶體模式告訴我們在C++中所有與記憶體有關的操作都需要程式員自己來負責,這樣就帶來了很多設計程式時的需要注意的地 方,而理解支援的四種基本範型卻是理解各種語言設施的基礎。然後記住C++的最大的一點設計哲學,也是其貫穿應用C++的一條本質,我引用《C++ PRIMER》中文版前言內的一句話表示--“C++的基礎是各種設施,它們讓使用者能夠通過定義新的資料類型來擴充語言本身,這些新類型可以與內建類型一 樣的使用方式(如何理解這句話是關鍵,我的理解是:使用者定義型別可以在任何使用內建類型的時候做為其替代,再具體點說就是使用者定義型別可以象內建類型那樣 可以被聲明,其對象可以被初始化,可以相互複製,可以象內建類型對象那樣和很多操作符一起使用,可以被作為參數傳遞給函數,可以作為函數的傳回值,可以作 為容器的操作對象,使用者定義型別可以和內建類型一樣作為模板的參數),掌握這些設施(哪些設施?就是讓使用者定義型別可以和內建類型一樣方便使用的設施,包 括什嗎?構造,拷貝,解構函數,操作副重載.....)的第一步就是理解基礎語言(什麼是基礎語言?就是C++中better c部分)。
在此,我還想提出一點十分重要的概念:一門語言的最本質的東西就是其類型系統,任何語言都有自己的獨特的類型系統,學習C++就是學習他的類型系統。所以首先需要徹底明白什麼是資料類型這個概念。這樣你的思路就清楚了,你有選擇,從每一種C++支援的設計範型入手學習。
結構化設計-----也就是C++中的better c部分,你需要在C的基礎上學會函數重載和引用這兩個最重要的語言新特心性。
基於對象----你需要建立C++最強大的概念--類,也就是使用者定義型別,這其實就是資料結構裡面接觸的抽象資料類型的概念,以及合理構造使用類的一系列語言措施。並始終記住,在C++進行設計時用類來表示我們需要表示的概念。類也是C++抽象機制裡面最核心的概念。
物件導向----在這裡你需要知道繼承和多態這樣的OO概念,以及控制代碼類這樣常見的設計技術,這裡你需要明白你開始進入了對介面編程的階段。同時你要學會 OO思想,C++的一些設施只是為了把OO思想在語言所支援的語義中充分的表示出來。但是在這裡,同時你需要明白的C++能表示的語義是受到其當初語言設 計原則限制的(什麼原則?靜態類型檢查,不為不需要的東西付出代價,選擇權在程式員手上語言本身不去強迫程式員的做出選擇),也就是說C++所能表示的 OO思想可以稱為具有C++特色的OO思想了。這樣的OO思想和JAVA所代表的純OO哪個更好?沒有定論,因為他們本身的設計理念就不一樣。
泛型設計----這裡你需要明白最重要的一點是C++的temlate機制無論其開始建立的初衷是什麼,現在他所代表的真實含義是:編譯時間類型推導,也就 是編譯時間多態,由此明白了泛型的核心---把各種類型當作一種抽象條件的具體化,C++有措施可以定義抽象條件嗎?沒有,所以這些條件只能定義在我們自己 的心中,但我們可以把具體化的類型當作一種抽象條件實現在template機制中去,從而使tempalte成為比類型推導機制更進一步的東西,那就是抽 象條件的推導。也就是說,我們不再把template接受的參數看成是類型,而是把template看成是一種接受抽象條件的機制,無論其類型如何,只要 這種類型滿足tempalte所接受的抽象條件就可以作為參數傳遞進去,這樣就代表了一種泛型的思想-----類型不再是根本,抽象條件才是,類型不過是 抽象條件的外衣和在C++中的實現方式而已。在結合基於對象和泛型設計這兩種抽象設計模式的技術上誕生的工業產品就是---STL。
最後再說點其他的想法,C++作為一門支援多種設計模型的電腦程式設計語言,其蘊涵思想可謂博大精深,熟練掌握已屬不易,精通更是難如登天,但就象C+ +開始設計的那樣,你對C++還不瞭解的地方並不妨礙你使用C++和用C++在你力所能及的範圍內作出合理的設計。但我們應該明白,到一定程度的時候我們 應該跳出去,站在一個更高的地方去重新審視C++,重新審視自己對於程式語言,對於設計思想,甚至與對於軟體本質的認識是否在不斷的進步?對於C++的全 心投入不能成為忽略其他的技術掌握的借口,總之,面對紛繁而來的新事物我們要有自己的判斷,過於浮華是我們所不恥的,但在成長的道路也決不能故步自封,做 井底之蛙。
這裡,終於完成了這不完美的總結,如果對你能有哪怕只是微不足道的協助,或者即使沒有協助,你也覺得沒有浪費剛才看這文章的時間話,我想我的目的就已經達到了,謝謝你的閱讀,我女朋友已經久等了:》,就次止筆。