(轉載)C++教程網(wǎng)www.cppcourse.com
面向對象的程序設計方法要求語言必須具備抽象、封裝、繼承和多態(tài)性這幾個關鍵要素。
面向對象程序設計,是通過為數(shù)據(jù)和代碼建立分塊的內存區(qū)域,以便提供對程序進行模塊化的一種程序設計方法。對象是計算機內存中的一塊區(qū)域,通過將內存分塊,每個模塊(即對象)在功能上相互之間保持相對獨立。
這些內存模塊中不但存儲數(shù)據(jù),而且也存儲代碼,這對保證對象是受保護的這一點很重要,只有對象中的代碼才可以訪問存儲于這個對象中的數(shù)據(jù),這清楚地限定了對象所具有的功能(即一個對象在一個軟件中所能起到的作用),并使對象保護它自己不受未知的外部其它的事件的影響,從而使自己的數(shù)據(jù)和功能不會因此遭到破壞。
在面向對象的程序中,對象之間可以通過函數(shù)調用實現(xiàn)相互通信。一個對象可以調用另一個對象的函數(shù),處于對象外部的代碼就沒有機會通過直接修改對象的內存區(qū)域。當對象的一個函數(shù)被調用時,對象執(zhí)行其內部代碼來響應這個調用,這使tb對象呈現(xiàn)出一定的行為。行為及其結果就是該對象的功能。對象被視為能做出動作的實體,動作在對象相互作用時被激發(fā),換句話說,對象就像在宿主計算機上擁有數(shù)據(jù)和代碼,并能相互通信的具有特定功能的一臺較小的計算機。
抽象
面向對象鼓勵程序員以抽象的觀點看待程序,即程序是由一組抽象的對象組成的。另一方面,我們又可以將一組對象的共同特征進一步抽象出來,從面形成“類”的概念。
抽象是一種從一般的觀點看待事物的方法,它要求程序員集中于事物的本質特征,而不是具體細節(jié)或具體實現(xiàn)。面向對象鼓勵程序員以抽象的觀點看待程序,也就是說程序是一組抽象的對象-類組成的(嚴格講,C++程序不是純面向對象的,因為程序中還有像main這樣的全局函數(shù))。程序從一組對象為起來,抽取公共的行為放入到一個類中,這是抽象分類的觀點,不同類的對象具有不同的行為。
類的概念來源于人們認識自然、認識社會的過程。在這一過程中,人們主要使用兩種方法:由特殊到一般的歸納法和由一般到特殊的演繹法。在歸納的過程中,我們從一個個具體的事物中把共同的特征抽取出來,形成一個一般的概念,這就是“歸類”;在演繹的過程中,我們又把同類的事物,根據(jù)不同的特征分成不同的小類,這又是“分類”。對于一個具體的類,它有許多具體的個體,我們就管這些個體叫做“對象”。
舉個例子,“人”是一個類,具有“直立行走、會使用工具”等一些區(qū)別于其它事物的共同特征;而張三、李四、王五等一個個具體的人,就是“人”這個類的一個個“對象”。
封裝
所謂數(shù)據(jù)封裝,就是將一組數(shù)據(jù)和與這組數(shù)據(jù)相關的操作集合組裝在一起,形成一個能動的實體,也就是對象。在這種情況下,用戶是不可以直接操作數(shù)據(jù)的,他必須通過和數(shù)據(jù)相關的操作來訪問數(shù)據(jù)。換句話說,數(shù)據(jù)封裝就是給數(shù)據(jù)提供了與外界聯(lián)系的標準接口,無論是誰,只有通過這些接口,使用規(guī)范的方式,才能訪問這些數(shù)據(jù)。同時,由于客戶端總是和接口打交道,他也就不必要了解數(shù)據(jù)的具體細節(jié)。
由此可見,封裝要求一個對象應具備明確的功能,并具有接口以便和其它對象相互作用。同時,對象的內部實現(xiàn)(代碼和數(shù)據(jù))是受保護的,外界不能訪問它們,只有局部于對象的代碼才可以訪問對象的內部數(shù)據(jù)。對象的內部數(shù)據(jù)結構的不可訪問性稱為數(shù)據(jù)隱藏。封裝使得一個對象可以像一個部件一樣用在各種程序中,而不用擔心對象的功能受到影響。
早期的軟件設計方法,把數(shù)據(jù)和程序混在一起,結構化很差,被細稱為“一碗面條”的編程方法。在這一階段程序的可讀性與可維護性都很差,于是產(chǎn)生了“軟件危機”,為了解除這種危機便提出了結構化程序設計。在結構化程序設計里,雖然程序被分為不同的模塊,以便大大減少不同模塊之間的相互作用,但數(shù)據(jù)仍然屬于整個程序的。這就又存在著這樣一個問題:一方面,程序員在設計每一個模塊的時候,都要或多或少地作全局考慮,模塊與模塊之間的耦合度相對太高了,勢必增加不同模塊的程序員之間溝通所帶來的工作量;另一方面,在某地方對數(shù)據(jù)的改動,有可能又對整個程序產(chǎn)生難以預料的影響。隨著軟件工程的進一步發(fā)展,軟件越來越大,數(shù)據(jù)越來越多,這個問題也越來越突出。
數(shù)據(jù)封裝的提出,就是為了解決這一問題。它一方面使得程序員在設計程序時可以專注于自己的對象,“各人自掃門前雪,莫管他人瓦上霜”,同時也切斷了不同模塊之間數(shù)據(jù)的非法使用,減少了出錯的可能性。
繼承
所謂繼承是指一個對象可以獲得另一個對象的特性的機制,它支持層次類這一概念。例如:紅蘋果屬于蘋果類,而蘋果類又屬于水果類。通過繼承,低層的類只需定義特定于它的特征,而共享高層類中的特征。
多態(tài)
不同的對象可以調用相同名稱的函數(shù),并可導致完全不同的行為的現(xiàn)象稱為多態(tài)性。利用多態(tài)性,程序中只需進行一般形式的函數(shù)調用,函數(shù)的實現(xiàn)細節(jié)留給接受函數(shù)調用的對象。這大大提高了我們解決復雜問題的能力。例如繪制三角形與繪制正方形所調用的繪制函數(shù)其效果肯定是不同的,但我們可以設計一個公共的Draw()函數(shù)代表繪制,而不同對象的繪制圖形的具體細節(jié)則分別由具體對象負責實現(xiàn)。