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