學習C++(一) 我現在理解的C++ (轉)

amyz發表於2007-11-16
學習C++(一) 我現在理解的C++ (轉)[@more@]

  學習C++(一) 

  我現在理解的C++

/*種種原因,很多精力要投入到的學習和使用中去了,想形成一個學習C++的系列文章,沒有什麼風格,也沒有什麼時間表,想到哪就去寫。這裡把以前自己另外一個ID發表的一篇文章的一部分作為這個系列的第一篇,算是開頭吧。*/

學習C++重在理解其各種語言設施所代表的語義,以及C++所能表示的語義所代表的設計思想。首先從宏觀上入手,你需要明白的是C++是設計語言的本質。在此我把C++最重要的性質寫下來:C++是一門靜態型別檢查,基於C,支援四種基本程式設計範型的語言。注意,這裡說明了三個本質特性,靜態說明了語言的型別檢查性質,基於C記憶體模式告訴我們在C++中所有與記憶體有關的操作都需要程式設計師自己來負責,這樣就帶來了很多設計程式時的需要注意的地方,而理解支援的四種基本範型卻是理解各種語言設施的基礎。然後記住C++的最大的一點設計哲學,也是其貫穿應用C++的一條本質,我引用《C++ PRIMER》中文版前言內的一句話表示--“C++的基礎是各種設施,它們讓能夠透過定義新的資料型別來擴充套件語言本身,這些新型別可以與內建型別一樣的使用方式(如何理解這句話是關鍵,我的理解是:使用者定義型別可以在任何使用內建型別的時候做為其替代,再具體點說就是使用者定義型別可以象內建型別那樣可以被宣告,其可以被初始化,可以相互複製,可以象內建型別物件那樣和很多運算子一起使用,可以被作為引數傳遞給,可以作為函式的返回值,可以作為容器的操作物件,使用者定義型別可以和內建型別一樣作為模板的引數),掌握這些設施(哪些設施?就是讓使用者定義型別可以和內建型別一樣方便使用的設施,包括什麼?構造,複製,解構函式,操作副過載.....)的第一步就是理解基本語言(什麼是基本語言?就是C++中better c部分)。

:namespace prefix = o ns = "urn:schemas--com::office" />

在此,我還想提出一點十分重要的概念:一門語言的最本質的東西就是其型別,任何語言都有自己的獨特的型別系統,學習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。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-982681/,如需轉載,請註明出處,否則將追究法律責任。

相關文章