- C++面向對象程序設計
- 杜茂康等編著
- 2305字
- 2019-01-01 05:54:50
1.1 面向過程與面向對象程序設計
1.面向過程程序設計
早期計算機程序的規模較小,主要開發方式為個人設計、個人使用,沒有組織原則,只需將相應的程序代碼組織在一起,再讓計算機執行它就可以完成相應的程序功能。隨著計算機技術的發展和應用的普及,程序的規模和復雜度越來越大,到了20世紀60年代初期,個人軟件開發方式已不能滿足要求,出現了許多問題,如軟件開發費用超出預算,不能按期完成軟件開發,質量達不到要求,軟件維護困難等,這就是所謂的軟件危機。
軟件危機表明個人手工編程方式已經跟不上軟件開發的需求了,迫切需要改變軟件的生產方式,提高軟件生產率。20世紀60年代末產生了影響深遠的結構化程序設計(Structure Programming,SP)思想。結構化程序設計采用“自頂向下、逐步求精、模塊化”的方法進行程序設計。即采用模塊分解、功能抽象、自頂向下、分而治之的方法,將一個復雜、龐大的軟件系統分解成為許多易于控制、處理、可獨立編程的子任務、子模塊。各模塊由順序、分支、循環三種基本結構組成,每個模塊則由結構化程序設計語言的子程序(函數)實現。其基本特點是:① 按層次結構組織模塊;② 每個模塊只有一個入口,一個出口;③ 代碼和數據分離,即“程序=數據結構+算法”。
在進行結構化程序設計時,首先將要解決的問題分解成若干個功能模塊,再根據模塊功能設計一系列用于存儲數據的數據結構,并編寫一些函數(或過程)對這些數據進行操作,最終的程序是由許多函數(或過程)組成的。
結構化程序設計是一種面向過程的程序設計方法,把數據和過程分離為相互獨立的程序實體,用數據代表問題空間的客體,表達實際問題中的信息;程序代碼則是用于體現和加工處理這些數據的算法。在設計軟件時,必須時時考慮所要處理數據的結構和類型,對于不同格式的數據要做相同的處理,或者對于相同格式的數據要做不同的處理,都必須編寫不同的程序,代碼的可重用性較差。
此外,代碼和操作過程的分離還會導致程序的可維護性也較差。其原因是它把數據和處理數據的過程(函數)分為兩個獨立的部分,當數據結構改變時,所有與之相關的處理過程都要進行修改,增大了程序維護的難度。
例如,假設實現一個通信錄管理軟件,程序員編寫了4個函數:InputData,SearchPhone,PrintData,SearchAddr,分別用于實現通信錄數據的輸入、輸出和數據查詢功能。許多技術都可以實現通信錄的數據存取,如數組、鏈表、隊列或堆棧等,本例中采用數組存取數據。
struct Person{ //用于存放個人信息的數據結構 char name[10]; char addr[20]; char phone[11]; } Person p[100]; //保存所有個人信息的全局數組 int n=0; //用于保存實際人數的全局變量 void InputData(){……} //初始化全局數組P,讀入每個人的姓名、地址和電話 void SearchAddr(char *name){……} //根據姓名查找地址 void SearchPhone(char *name){……} //根據姓名查找電話號碼 void PrintData(){……} //打印輸入每個人的姓名、地址和電話
這4個函數通過全局數組(即P)共享數據,并且相互影響。如果將這些函數提供給其他程序員使用,就必須讓該程序員知道他不能定義和修改全局數組(即P),只能通過這4個過程存取全局數據P。
個人通信錄管理程序代表了面向過程的編程方法:先定義一些全局性的數據結構,然后編寫一些過程對這些數據結構進行操作,其模型如圖1-1所示。

圖1-1 結構化程序設計模型
從圖1-1的程序模型可以看出,數據和函數之間存在潛在的連接關系。某個全局數據的修改可能會引起大量操作該全局數據的函數的修改。此外,若某個函數意外修改了某個全局數據,很可能引起程序數據的混亂。例如在個人通信錄管理程序中,Person的變化會引起操作它的所有函數(如InputData()、SearchAddr()等)的修改。此外,誰也沒有辦法限制其他程序員定義與全局數據同名的變量(如數組P),也不能限制他修改全局數組的值。當程序規模較大時,這個問題尤其突出,軟件維護困難。
支持結構化程序設計的高級語言稱為結構化程序設計語言,提供了順序、分支和循環三種基本結構,支持面向過程的程序設計。C、Fortran、BASIC、Pascal、Foxpro等都是當前仍在廣泛使用的面向過程的程序設計語言。
2.面向對象程序設計
隨著計算機技術的發展,軟件應用的領域更加廣泛,軟件的規模和復雜度越來越大,軟件更新的速度更快,面向過程程序設計技術已不能滿足軟件開發在效率、代碼共享和更新維護等方面的需求了,取而代之的是面向對象的程序設計技術。
面向對象程序設計的基本觀點是:計算機求解的都是現實世界中的問題,它們由一些相互聯系并且處于不斷運動變化的事物(即對象)組成,每個事物都可以通過兩方面來刻畫:描述事物狀態的數據和描述事物行為的函數,應該把它們結合成一個整體,代表一個客觀事物,這個整體就是對象。
可以看出,一個對象由數據和函數兩部分構成。數據常被稱為數據成員,函數則被稱為成員函數。一個對象的數據成員通常只能通過自身的成員函數修改。對象真實地表達了客觀事物,它將數據和操作數據的過程(函數)綁在一起,形成一個相互依存、不可分離的整體(即對象),從同類對象中抽象出共性,形成類。同類對象中的數據原則上只能用本類提供的方法(成員函數)進行處理。
面向對象程序技術能夠實現對客觀世界的真實模擬,反映出世界的本來面目。從客觀世界中抽象出一個個對象,對象之間能夠傳遞消息(一個對象向其他對象發出的服務請求信息),并通過特定的函數進行數據訪問,禁止以任何未經允許的方式修改對象的數據,這就是面向對象程序設計的基本模式,如圖1-2所示。

圖1-2 面向對象程序設計的程序模型
面向對象程序技術提高了軟件的重用性、靈活性和擴展性,且使軟件具有更好的可維護性。因為某類對象數據的改變只會引起該類對象程序代碼的改變,而與其他類型的對象無關,這就把程序代碼的修改維護局限在了一個很小的范圍內。由于數據和操作它的函數是一個整體,因此易被重用。在擴展某個對象的功能時,不用考慮它對其他對象的相互影響,軟件功能的擴展更容易。