天天看點

《C++程式設計教程(第3版)》——第1章,第3節程式設計方法

本節書摘來自華章出版社《c++程式設計教程(第3版)》一書中的第1章,第1.3節程式設計方法,作者張志航,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

1.3 程式設計方法

c++語言的兩個組成部分是過程性語言部分和“類”部分。過程性語言部分和c語言沒有本質差别。“類”部分是c語言中沒有的,它是面向對象程式設計的主體。要學好面向對象程式設計,首先必須具有過程性語言的基礎。是以學習c++,首先必須學習其過程性語言部分,然後再學習“類”部分。

過程性語言部分采用的是結構化程式設計方法,“類”部分采用的是面向對象程式設計方法,程式設計方法正在從結構化方法向面向對象方法演變。c語言僅支援結構化程式設計,而c++語言既支援結構化程式設計也支援面向對象程式設計。

1.3.1 結構化程式設計方法

結構化程式設計的主要思想是:将任務按功能分解并逐漸求精。将複雜的大型任務分解成若幹子產品,每個子產品進一步劃分成更小的、功能完整的子子產品,繼續劃分直到得到原子子產品,每個原子子產品用一個過程或函數完成。一個過程或函數由多條可順序執行的語句構成。程式設計者把資料與過程或函數分開存儲。編寫程式的主要技巧在于追蹤函數的調用及傳回過程,追蹤在這個過程中資料發生了怎樣的變化。結構化程式設計方法能夠較好地分解并解決一些複雜任務。其主要缺點是,程式依賴于資料結構,當資料結構發生變化時,必須對過程或函數進行修改。另外,當開發一個新任務時,适用于舊任務的程式一般不能重複利用。從程式設計的角度來說需要重複投入,即重新開發程式。而基于可重用指導思想的面向對象程式設計方法能夠較好地解決這一問題。

1.3.2 面向對象程式設計方法

面向對象程式設計(object oriented programming,oop)方法是近年來十分流行的一種程式設計方法,它試圖用客觀世界中描述事物的方法來描述一個程式要解決的問題。對象是客觀世界中一個實際存在的事物,如一個具體的“人”就是一個對象。将“人”的共同屬性抽象出來就可以構成“類”,如“人”類,它具備的靜态屬性有姓名、年齡、性别、身高和體重等,它同時具備的動态屬性有學習、思考、走路、說話和吃飯等,一般将靜态屬性作為類的資料成員,而将動态屬性作為類的執行代碼。類是一個抽象的概念,而對象是類的具體執行個體,如“人”類的一個對象就是指一個具體的人。

面向對象程式設計的3個主要特性如下所示。

1)封裝性 封裝是實作資訊隐蔽的基礎。将描述對象的資料(靜态屬性)及對這些資料進行處理的程式代碼(動态屬性)有機地組成一個整體,同時對資料及代碼的通路權限加以限制,這種特性稱為封裝。封裝可以使對象内部的資料隐藏起來,在類外不能直接通路它們,而隻能通過對象的公有執行代碼接口來間接通路對象内部的資料。這樣既可保護類中的資料成員,也可使程式設計者隻關心該對象可完成的動作,而不必去關心其内部的資料及代碼實作細節。

2)繼承性 繼承是軟體重用的基礎,它可以提高軟體開發效率。通過繼承可以在已有類的基礎之上擴充并産生一個新類。已有類稱為基類或父類,新類稱為派生類或子類。派生類除了繼承基類的資料及代碼之外,可以按需要增加資料和代碼。基類的資料和代碼在派生類中是可以直接使用的,即基類的代碼可以在派生類中重複利用,這就是軟體重用,它可以提高代碼編寫效率。

3)多态性 多态性是提高程式設計效率及提高程式設計靈活性的機制。多态分為靜态多态和動态多态。

靜态多态 靜态多态分為函數重載、運算符重載、函數模闆和類模闆。

函數重載是指同名函數完成不同功能,一般用于完成類似功能,如兩個同名函數abs(),分别可以用來求整型量和實型量的絕對值。如果沒有函數重載機制,求整型量和實型量的絕對值就必須用兩個不同的函數名來實作。函數重載減輕了程式設計時記憶多個完成類似功能的函數名的負擔。

運算符重載是将c++提供的基本運算符應用到新類的機制。例如,加号(+)運算符可以實作c++基本資料類型的整型量、實型量的相加等。對于使用者新定義的類如“複數”類,通過運算符重載機制,可以使用加号實作兩個複數對象的直接相加。

函數模闆是将結構相同而僅僅資料類型不同的多個函數進行資料類型虛拟化得到的函數的抽象描述。類模闆是将結構相同而僅僅資料類型不同的多個類進行資料類型虛拟化得到的類的抽象描述。在調用函數模闆和使用類模闆定義對象時,編譯器能夠根據實際的資料類型以函數模闆和類模闆為基礎自動生成含有具體類型的函數和類,以提高程式設計的自動化水準,即提高程式設計效率。

動态多态 動态多态是指不同的對象在接收到相同的消息後,以不同的行為去應對。所謂消息是指對象接收到的需要執行某個“操作”的指令,操作是函數完成的。動态多态的實作機制是,在基類中定義完成某個操作的虛函數,在不同的派生類中重新定義完成這個“操作”的同名函數,不同派生類中的這些函數完成不同的工作,那麼不同派生類對象接收到同樣的“消息”時,就可以表現出不同的行為。

例如,基類是一個抽象的“幾何圖形”,它具有“繪圖”行為,但這個行為沒有具體含義,因為并不知道具體繪制什麼圖形。從“幾何圖形”類派生出“三角形”類、“圓”類或“矩形”類,在派生類中“繪圖”功能有具體含義,可重新定義“繪圖”功能,實作具體圖形的繪制。在基類中的虛拟共同行為“繪圖”,在派生類中具有不同的實作行為。不同的派生類對象接收到“繪圖”消息時,即産生了不同的行為。

動态多态既提供了“消息”的統一入口,又實作了不同對象對同一消息的不同響應,提高了程式設計的靈活性。

繼續閱讀