面向對象的程序設計方法要求語言必須具有抽象、封裝、繼承和多態性這幾個關鍵要素。編程
面向對象程序設計,是經過爲數據和代碼創建分塊的內存區域,以便提供對程序進行模塊化的一種程序設計方法。對象是計算機內存中的一塊區域,經過將內存分塊,每一個模塊(即對象)在功能上相互之間保持相對獨立。數據結構
這些內存模塊中不但存儲數據,並且也存儲代碼,這對保證對象是受保護的這一點很重要,只有對象中的代碼才能夠訪問存儲於這個對象中的數據,這清楚地限定了對象所具備的功能(即一個對象在一個軟件中所能起到的做用),並使對象保護它本身不受未知的外部其它的事件的影響,從而使本身的數據和功能不會所以遭到破壞。模塊化
在面向對象的程序中,對象之間能夠經過函數調用實現相互通訊。一個對象能夠調用另外一個對象的函數,處於對象外部的代碼就沒有機會經過直接修改對象的內存區域。當對象的一個函數被調用時,對象執行其內部代碼來響應這個調用,這使tb對象呈現出必定的行爲。行爲及其結果就是該對象的功能。對象被視爲能作出動做的實體,動做在對象相互做用時被激發,換句話說,對象就像在宿主計算機上擁有數據和代碼,並能相互通訊的具備特定功能的一臺較小的計算機。函數
抽象工具
面向對象鼓勵程序員以抽象的觀點看待程序,即程序是由一組抽象的對象組成的。另外一方面,咱們又能夠將一組對象的共同特徵進一步抽象出來,從面造成「類」的概念。post
抽象是一種從通常的觀點看待事物的方法,它要求程序員集中於事物的本質特徵,而不是具體細節或具體實現。面向對象鼓勵程序員以抽象的觀點看待程序,也就是說程序是一組抽象的對象-類組成的(嚴格講,C++程序不是純面向對象的,由於程序中還有像main這樣的全局函數)。程序從一組對象爲起來,抽取公共的行爲放入到一個類中,這是抽象分類的觀點,不一樣類的對象具備不一樣的行爲。spa
類的概念來源於人們認識天然、認識社會的過程。在這一過程當中,人們主要使用兩種方法:由特殊到通常的概括法和由通常到特殊的演繹法。在概括的過程當中,咱們從一個個具體的事物中把共同的特徵抽取出來,造成一個通常的概念,這就是「歸類」;在演繹的過程當中,咱們又把同類的事物,根據不一樣的特徵分紅不一樣的小類,這又是「分類」。對於一個具體的類,它有許多具體的個體,咱們就管這些個體叫作「對象」。設計
舉個例子,「人」是一個類,具備「直立行走、會使用工具」等一些區別於其它事物的共同特徵;而張3、李4、王五等一個個具體的人,就是「人」這個類的一個個「對象」。指針
封裝
所謂數據封裝,就是將一組數據和與這組數據相關的操做集合組裝在一塊兒,造成一個能動的實體,也就是對象。在這種狀況下,用戶是不能夠直接操做數據的,他必須經過和數據相關的操做來訪問數據。換句話說,數據封裝就是給數據提供了與外界聯繫的標準接口,不管是誰,只有經過這些接口,使用規範的方式,才能訪問這些數據。同時,因爲客戶端老是和接口打交道,他也就沒必要要了解數據的具體細節。
因而可知,封裝要求一個對象應具有明確的功能,並具備接口以便和其它對象相互做用。同時,對象的內部實現(代碼和數據)是受保護的,外界不能訪問它們,只有局部於對象的代碼才能夠訪問對象的內部數據。對象的內部數據結構的不可訪問性稱爲數據隱藏。封裝使得一個對象能夠像一個部件同樣用在各類程序中,而不用擔憂對象的功能受到影響。
早期的軟件設計方法,把數據和程序混在一塊兒,結構化不好,被細稱爲「一碗麪條」的編程方法。在這一階段程序的可讀性與可維護性都不好,因而產生了「軟件危機」,爲了解除這種危機便提出告終構化程序設計。在結構化程序設計裏,雖然程序被分爲不一樣的模塊,以便大大減小不一樣模塊之間的相互做用,但數據仍然屬於整個程序的。這就又存在着這樣一個問題:一方面,程序員在設計每個模塊的時候,都要或多或少地做全局考慮,模塊與模塊之間的耦合度相對過高了,勢必增長不一樣模塊的程序員之間溝通所帶來的工做量;另外一方面,在某地方對數據的改動,有可能又對整個程序產生難以預料的影響。隨着軟件工程的進一步發展,軟件愈來愈大,數據愈來愈多,這個問題也愈來愈突出。
數據封裝的提出,就是爲了解決這一問題。它一方面使得程序員在設計程序時能夠專一於本身的對象,「各人自掃門前雪,莫管他人瓦上霜」,同時也切斷了不一樣模塊之間數據的非法使用,減小了出錯的可能性。
繼承
所謂繼承是指一個對象能夠得到另外一個對象的特性的機制,它支持層次類這一律念。例如:紅蘋果屬於蘋果類,而蘋果類又屬於水果類。經過繼承,低層的類只需定義特定於它的特徵,而共享高層類中的特徵。
多態
不一樣的對象能夠調用相同名稱的函數,並可致使徹底不一樣的行爲的現象稱爲多態性。
若是子類中的成員函數對父類中的成員進行了覆蓋,當一個指向中子類的父類指針或引用了子類的父類引用,當使用它調用虛函數,而後根據實際的調用對象調用子類中的覆蓋函數,而不是父類中了虛函數,這種語法現象叫多態。
利用多態性,程序中只需進行通常形式的函數調用,函數的實現細節留給接受函數調用的對象。這大大提升了咱們解決複雜問題的能力。例如繪製三角形與繪製正方形所調用的繪製函數其效果確定是不一樣的,但咱們能夠設計一個公共的Draw()函數表明繪製,而不一樣對象的繪製圖形的具體細節則分別由具體對象負責實現。