【正文】
exactly how the procedure is implemented. THE PROCEDURAL PARADIGM WITH ADTs. DATA ABSTRACTION is concerned with separating the behavior of a data object from its representation or implementation. For example, a stack contains the operations Push, Pop, and IsEmpty. A stack object provides users with these operations, but does not reveal how the stack is actually implemented. The stack could be implemented using an array or a list. Users of the stack object do not care how the stack is implemented, only that it performs the above operations correctly and efficiently. Because the underlying implementation of the data object is hidden from its users, the implementation can easily be changed without affecting the programs that use it. When we design algorithms, we often need a particular data type to use in order to carry out the algorithm39。 在這后兩點(diǎn)的面向?qū)ο蠓治鲋校覀兛梢钥吹?C++很好的支持了面向?qū)ο蟮姆独?,選擇運(yùn)算 (`?:39。),成員運(yùn)算(`.*39。你不能把單目運(yùn)算符返回到雙目運(yùn)算或多目運(yùn)算中。在 C++中,一個(gè)運(yùn)算符函數(shù)的定義就像一個(gè)成員函數(shù)的定義,在其名字的前面加上關(guān)鍵字 operator。運(yùn)算符的定義和 C++函數(shù)的定義相似,可以作為類的成員或非成員。一個(gè)復(fù)數(shù)的類型要有加減的運(yùn)算。當(dāng)有相同函數(shù)時(shí),編譯器通過檢查它的返回值和參數(shù)決定哪個(gè)被調(diào)用。當(dāng)一個(gè)函數(shù)被使用在多個(gè)程序時(shí)就是重載。派生類必須給出他們的實(shí)現(xiàn)。一個(gè)類當(dāng)它只有虛函數(shù)的定義而沒有實(shí)現(xiàn)時(shí)是抽象類。虛函數(shù)也可以用在邏輯的運(yùn)算上。 虛函數(shù)機(jī)制可以通過一個(gè)基類的參數(shù)或指針調(diào)用。這是一個(gè)動(dòng)態(tài)的約束。它只有一個(gè)對(duì)成員函數(shù)的 說明使用于類中所有的例子。當(dāng)所有的函數(shù)傳遞同樣的信息值時(shí),虛函數(shù)的機(jī)制確保在動(dòng)態(tài)運(yùn)行時(shí)了調(diào)用正確的函數(shù)。 C++提供了三種類型的多態(tài):虛函數(shù),函數(shù)重載和運(yùn)算符重載。多態(tài),和繼承一起,對(duì)面向?qū)ο蟪绦蛴泻艽蟮挠猛?。最后,?dāng)在基類中的公共部分和保護(hù) 部分使用私有繼承,基類可以調(diào)用,但用戶和派生類不可以使用。在基類中的公共接口使用公有繼承,在派生類中隊(duì)用戶也是公有接口。 5 總之,一個(gè)類有兩個(gè)主要的接口:一個(gè)是給用戶所使用的(公共接口),另一個(gè)派生類所使用(公有部分和保護(hù)部分的聯(lián)合)。如果你所有的派生類是基類的一個(gè)說明構(gòu)造時(shí),只有使用公有繼承,否則,要使用私有繼承。 如果可以的話,最好使用數(shù)據(jù) 成員。當(dāng)繼承是接口的部分時(shí),派生類要使用保護(hù)繼承,但是不是接口的所有部分都可以被用戶使用。保護(hù)繼承也是一種可以使用 HASA 關(guān)系的繼承。這是一個(gè)修改為不同的基類的運(yùn)行。但是派生類 中的成員函數(shù)可以自由的訪問或調(diào)用基類中的公共部分和私有部分。在私有繼承的情況下,原來基類中的公有部分和保護(hù)部分,在派生類中都變?yōu)樗接胁糠帧? 可以在兩個(gè)類之間使用繼承創(chuàng)建一個(gè)互相包含的關(guān)系。例如,一個(gè)堆??梢员划?dāng)作一個(gè)數(shù)組使用。不是所有對(duì)象它都是其他對(duì)象的一個(gè)專門說明和繼承,可能這些對(duì)象有些是其他對(duì)象的一部分或是包含在其他的對(duì)象中。 在 C++中執(zhí)行 ISA 關(guān)系需要使用公有繼承。 ISA 的關(guān)系是傳統(tǒng)的繼承關(guān)系,也就是派生類型。這種關(guān)系是類型與類型,類與類之間特有的關(guān)系。這些不同的方式應(yīng)用在不同的對(duì)象間關(guān)系。但不是所有的類之間都可以建立繼承的關(guān)系。大部分的類之間可以歸納為繼承的關(guān)系。當(dāng)設(shè)計(jì)一個(gè)軟件系統(tǒng)時(shí),需要建立一系列的對(duì)象,并且需要互相關(guān)聯(lián)的一系列對(duì)象。繼承可以從與原有的類型擴(kuò)展到派生類型。 C++可以認(rèn)為是 C 語言的擴(kuò)展的過程語言或面向?qū)ο笳Z言。但是,使用面向?qū)ο笳Z言,如 C++,由于語言支持對(duì)象間的繼承關(guān)系,從而可以更方便的了解設(shè)計(jì)執(zhí)行。 當(dāng)設(shè)計(jì)了一種方案,一種程序語言就可以被選擇執(zhí)行。 C++通過調(diào)用函數(shù)模擬信息的傳遞 。例如一個(gè)語句 i (),我們可以有效的把信息傳給 a2 的對(duì)象,以確定組的大小并返回其值。和私有成員相同的一點(diǎn),保護(hù)成員不可以被用戶程序訪問。 C++定義了關(guān)鍵字 protected 來完成繼承的實(shí)現(xiàn)。 C++無法提供一個(gè)使所有細(xì)節(jié)完全排除在基本操作之外的方法,因此一個(gè)類的私 有部分必須這個(gè)類的定義,從而有效的訪問這個(gè)類的變量,并可以繼承。當(dāng)對(duì)象離開它所在的范圍時(shí),調(diào)用析構(gòu)函數(shù)釋放對(duì)象。構(gòu)造函數(shù)和析構(gòu)函數(shù)提供了對(duì)象的初始化和釋放功能。 一個(gè)類的定義并不分配內(nèi)存。公共的接口部分標(biāo)有關(guān)鍵字public。 C++提供了關(guān)鍵字來說明類中哪些 成員是不可見的,哪 些部分是其公共接口。一個(gè) C++的類既包括共有的部分,又包括私有的部分。 重復(fù)的調(diào)用一個(gè)抽象的數(shù)據(jù)可以對(duì)用戶隱藏對(duì)一個(gè)數(shù)據(jù)對(duì)象的操作細(xì)節(jié)。一個(gè)類就像 C 的結(jié)構(gòu),但不同的是同時(shí)包括了數(shù)據(jù)和方法。設(shè)計(jì) 3 一個(gè)系統(tǒng)使用面向?qū)ο蟮姆独?,從而使得系統(tǒng)的操作和運(yùn)行更類似于真實(shí)世界中所對(duì)應(yīng)的真實(shí)個(gè)體。每一個(gè)對(duì)象的設(shè)置和運(yùn)行都是自身所包含的。 學(xué)習(xí)面向?qū)ο蠓独钪匾囊稽c(diǎn)是如何改變我們思考建造軟件體系的思路。一個(gè)對(duì)象的執(zhí)行是一個(gè)循環(huán)遞歸的過程,當(dāng)定義這個(gè)對(duì)象和 方法的初始值是,可以跳出這個(gè)循環(huán)遞歸的過程。只有對(duì)象本身才可以改變它內(nèi)部的數(shù)據(jù)值。信息(從其他的對(duì)象或程序)傳遞給對(duì)象,以便通知對(duì)象運(yùn)行下一個(gè)操作。這些對(duì)象被用來構(gòu)建計(jì)算,定義軟件系統(tǒng)的操作運(yùn)行。Smalltalk, C++, ObjectiveC, 和 Lisp with CLOS (the Common Lisp Object System)這些程序語言都是面向?qū)ο笳Z言的例子,它們都可以提供對(duì)壓縮,繼承和多態(tài)的支持。 壓縮,繼承和多態(tài)被認(rèn)為是面向?qū)ο蟪绦虻幕咎卣?,所有的面向?qū)ο蟪绦蛘Z言必須提供這些特征。例如,我們有一部分對(duì)象它們可以執(zhí)行一類操作,但是只有在運(yùn)行時(shí)我們才知道對(duì)象的類型。面向?qū)ο蟮牡谌N特性是多態(tài)。新對(duì)象的不同在于只需要提供方法或數(shù)據(jù)。繼承允許從已存在的對(duì)象中創(chuàng)建新的對(duì)象。 面向?qū)ο蠓独哂腥N主要特性,第一種,壓縮,其機(jī)制是為了實(shí)施數(shù)據(jù)抽象。但是,程序不僅僅是抽象值的運(yùn)算,在面向?qū)ο蠓独N還有對(duì)對(duì)象的運(yùn)算。近來,程序語言擴(kuò)展到支持新的數(shù)據(jù)類型的定義和提供便利給數(shù)據(jù)抽象。抽象數(shù)據(jù)類型的使用使得算法的設(shè)計(jì)得到更大的推廣,使得我們?cè)谒惴ㄔO(shè)計(jì)時(shí),注重了算法的全面,而不會(huì)拘泥于運(yùn)行的細(xì)節(jié)。如果可以定義變量的數(shù)據(jù)類型,而不影響到實(shí)際數(shù)據(jù)類型的運(yùn)行,就可以很容易的制訂出算法。用戶無法看到數(shù)據(jù)的基本操作,執(zhí)行可以方便的更改而不影響程序的運(yùn)行。其他部分調(diào)用時(shí),只是正確有效的執(zhí)行 ,但不清楚過程的執(zhí)行。抽象可以把動(dòng)作和結(jié)果隔離。許多主流程序還是這種語言。參數(shù),即存儲(chǔ)的一部分,被引進(jìn)在范例中。命令可以使機(jī)器找到解決方法,使用指定命令改變存儲(chǔ),變量讀取,算術(shù)和邏輯表達(dá)式,條件分枝控制執(zhí)行流。這是計(jì)算機(jī)體系的 von Neumann 模型。 C++包括了命令和程序范例的特性,例如,其前身 — C,和面向?qū)ο蠓独? 一種語言不僅要符合一種范例,而且能夠使用多種范例提供的特性和特征。一般來說,幾種語言可能屬于同一種范例。我們可以選擇一種語言,使用范例獨(dú)立的完成。一個(gè)范例可以被認(rèn)為是一個(gè)模式或者一個(gè)框架來設(shè)計(jì)和描述軟件結(jié)構(gòu)。 通過范例設(shè)計(jì)軟件 當(dāng)設(shè)計(jì)一個(gè)小的計(jì)算機(jī)程序或大的軟件系統(tǒng)是,我們要思考問題的解決模式。使用多種多樣的語言建立不同的設(shè)計(jì)方案。其他語言可以用來解決不同的問題領(lǐng)域和多方面的用途。然而,并不是一種程序語言可以最好的解決所有問題。每一個(gè)問題都需要不同的數(shù)據(jù)結(jié)構(gòu)和算法。只有硬件設(shè)計(jì)師了解如何在其他成分之外建立計(jì)算機(jī)體系,語言設(shè)計(jì)者同樣認(rèn)識(shí)到程序可以在一個(gè)高水平的環(huán)境編寫,因而是程序員可以不必了解機(jī)器的細(xì)節(jié)。第一個(gè)編程語言對(duì)基本的機(jī)器結(jié)構(gòu)有很大的依賴性。 1 面向?qū)ο蠛?C++ C++是目前所使用的眾多編程語言中的一種。為什么會(huì)有那么多的語言?為什么總會(huì)有新的語言不斷出現(xiàn)?編程語言可以幫助程序員方便實(shí)現(xiàn)從設(shè)計(jì)到實(shí)現(xiàn)。這時(shí)程序的細(xì)節(jié)很笨重。 為什么有這么多高水平的編程語言?有很多語言可以訪問大型數(shù)據(jù)庫,格式化金融報(bào)告,控制機(jī)器人在工廠工作,處理機(jī)件,控制衛(wèi)星實(shí)時(shí)模擬核反應(yīng)堆,預(yù)測(cè)變化 的大氣層狀況,下棋和繪制電路圖。程序語言作為一種工具幫助我們解決這些問題。新的語言被開發(fā)來更好的解決一類特定的問題。每個(gè)程序語言固定一個(gè)特定的程序體系或設(shè)計(jì)程序原理。這些方案被叫做程序范例,幫助我們思考問題,規(guī)范解決。怎樣去設(shè)計(jì)一個(gè)模式?程序范例提供 了許多不同的方法去設(shè)計(jì)和思考軟件系統(tǒng)。這個(gè)模式幫助我們?nèi)ニ伎己鸵?guī)范解決。當(dāng)所選擇的語言提供的結(jié)構(gòu)和機(jī)制符合范例時(shí),就很容易完成。因此,一種范例可以被看作一種語言的類?;旌险Z言,如 C++,綜合了兩到三種范例。 命令范例:命令范例的特性是 計(jì)算機(jī)的抽象模型和巨大的內(nèi)存存儲(chǔ)。計(jì)算命令,由一系列的命令組成,以代碼形式存儲(chǔ)。 程序范例:它包括了命令范例,還有對(duì)概念命令和表達(dá)的抽象機(jī)制。還包括重復(fù),選擇等特征。程序范例在程序設(shè)計(jì)中首次引進(jìn)了抽象的概念。過程是抽象的表格,完成一些任務(wù)或功能。 2 程序范例和 ADT:數(shù)據(jù)抽象使一個(gè)數(shù)據(jù)對(duì)象的行為和它的描述或執(zhí)行相分離。 當(dāng)我們?cè)O(shè)計(jì)一個(gè)算法時(shí),需要一個(gè)特定的數(shù)據(jù)類型執(zhí)行算法的操作。通過定義數(shù)據(jù)的用法和操作,假定可以選擇任何一種運(yùn)行,這種定義就叫做抽象數(shù)據(jù)類型。當(dāng)算法設(shè)計(jì)完成 時(shí),實(shí)際的數(shù)據(jù)類型被執(zhí)行。 面向?qū)ο蟮姆独核匀槐A袅嗽S多程序范例的特征,過程仍然是計(jì)算的主要形式。對(duì)象同抽象數(shù)據(jù)類型很相似,聯(lián)系著數(shù)據(jù)和運(yùn)算。第二種,繼承。這個(gè)新創(chuàng)建的對(duì)象是原對(duì)象的具體說明。當(dāng)一個(gè)對(duì)象從另一個(gè)對(duì)象中被創(chuàng)建或取得時(shí) ,就說新對(duì)象繼承了它父對(duì)象的方法和數(shù)據(jù),并增加了一些新的描述和說明。多態(tài)可以使不同類型的的對(duì)象對(duì)相同的信息執(zhí)行相同的操作。面向?qū)ο笳Z言包含的機(jī)制確保了每一類信息傳遞給正確的對(duì)象。一般來說,語言通過不同的途徑支持這些特征的實(shí)現(xiàn)。 構(gòu)建一個(gè)面向?qū)ο蟮某绦蛐枰獩Q定解決問題所需的對(duì)象。信息的傳遞是對(duì)象間最基本的相互作用機(jī)制。對(duì)象需要負(fù)責(zé)維護(hù)它所相關(guān)的數(shù)據(jù)的狀態(tài)。對(duì)象本身可以完全的調(diào)用它的子對(duì)象。這時(shí),這個(gè)方法和數(shù)據(jù)所組成的元素可以使用程序語言所提供的基本的構(gòu)造函數(shù)。系統(tǒng)被認(rèn)為是由多個(gè)單一獨(dú)立的個(gè)體組成,其中每個(gè)個(gè)體只負(fù)責(zé)對(duì)其自身的操作的運(yùn)行。由于對(duì)象常常模仿真實(shí)世界的個(gè)體的概念,因而這樣的一個(gè)模型推動(dòng)了軟件方面的設(shè)計(jì)(以及后來的實(shí)行)。 C++面向?qū)ο蟮奶匦? 壓縮: C++繼承了 C 的發(fā)展,并且定義的新的方便的數(shù)據(jù)類型。除此之外, C++還提供了類中各個(gè)成員訪問權(quán)限的不同,以此方便的控制即使是在不同的類,也可以訪問類中的成員。用戶只可以通過一個(gè)公共的接口來訪問這個(gè)對(duì)象。公有的部分提供給用戶關(guān)于這個(gè)類的接口,私有的部分只有構(gòu)造這個(gè)類的函數(shù)才可以訪問。不可見的成員在其定義的部分標(biāo)明了關(guān)鍵字 private。當(dāng)一個(gè)類是私有的類時(shí),意味著只有這個(gè)類的函數(shù)或友元可以使用它。當(dāng)一個(gè)數(shù)據(jù)對(duì)象被創(chuàng)建并且具有變量聲明時(shí)才分配內(nèi)存。當(dāng)一個(gè)對(duì)象被聲明時(shí),它的構(gòu)造函數(shù)初始化其在內(nèi)存的值。 我們不可能對(duì)用戶完全的隱藏操作的細(xì)節(jié)。建造一個(gè)類可以使它方便的訪問它父類的私有成員。保護(hù)成員既可以被類的成員函數(shù)訪問,也可以被派生類的成員函數(shù)訪問。 對(duì)象所需要注意的最后一點(diǎn),信息的重復(fù)傳遞時(shí)對(duì)象間交流的基本功能。實(shí)際上,這里并沒有真的傳遞信息。編譯器確保對(duì)所需要的對(duì)象調(diào)用正確的函數(shù),因此,在 C++中,可以把信息的傳遞當(dāng)作函數(shù)的調(diào)用??梢栽谠O(shè)計(jì)的過程中找到對(duì)象間的繼承關(guān)系,甚至可以使用傳統(tǒng)的,非面向?qū)ο蟮恼Z言設(shè)計(jì)系統(tǒng)。 C++語言是混