C++-怎樣寫程序(面向對象)
使用編程語言寫好程序是有技巧的。
主要編程技術:
1. 編程風格
2. 算法
3. 數據結構
4. 設計模式
5. 開發方法
編程風格指的是編程的細節,比如變量名的選擇方法、函數的寫法等。
算法是解決問題的方法。現實中各種算法都已經廣為人知了,所以編程時的算法也就是對這些技巧的具體應用。有很多算法,如果單靠自己去想是很難想出來的。比方說數組的排序就有很多的算法,如果我們對這些算法根本就不了解,那麽要想做出高速排序程序會很困難。算法和特定的數據結構關系很大。
所以有一位計算機先驅曾經說過:“程序就是算法加數據結構。”
設計模式是指設計軟件時,根據以前的設計經驗對設計方法進行分類。
開發方法是指開發程序時的設計方法,指包括項目管理在內的整個程序開發工程。小的軟件項目可能不是很明顯,在大的軟件項目中,隨著開發人員的增加,整個軟件工程的開發方法 就很重要。
面向對象的編程方法
下面,我們來看看Ruby的基本原理——面向對象的設計方法。面向對象的設計方法是20世紀60年代後期,在誕生於瑞典的Simula編程語言中最早開始使用的。Simula作為一種模擬語言,對於模擬的物體,引入了對象這種概念。比如說對於交通系統的模擬,車和信號就變成了對象。一輛輛車和一個個信號就是一個個對象,而用來 定義這些車和信號的,就是類
如今,面向對象的設計思想已經相當重要且深入人心了,以後它的地位和重要性也應該不會降低。所以在學習編程語言時,對面向對象設計思想的理解就非常重要。
但是,很多程序員覺得面向對象的設計思想很難,不容易理解,那麽它的難點在何處?
面向對象的難點
面向對象的難點在於,雖然有關於面向對象的說明和例子,但是面向對象具體的實現方法卻不是很明確。
面向對象這個詞本身是很抽象的,越抽象的東西,人們就越難理解。並且對於面向對象這個概念,如果沒有嚴密的定義,不同的人就會有不同的理解。
我認為面向對象編程語言中最重要的技術是“多態性”。我們就先從多態性說起吧。
多態性
多態性,英文是polymorphism
換個說法,多態就是可以把不同種類的東西當做相同的東西來處理。
只從字面上分析不容易理解,舉例說明一下。
看看圖2-1所示的3個箱子。每個箱子都有不同的蓋子。一個是一般的蓋子,一個是帶鎖的蓋子,一個是帶有彩帶的蓋子。因為箱子本身非常昂貴,所以每個箱子都有專人管理,如果要從箱子裏取東西,要由管理人員去做。
操作對象是三個箱子,分別是蓋著蓋子的箱子、加了鎖的箱子、系了彩帶的箱子
打開3個箱子的方法都不同,但如果發出同樣的打開箱子的命令,3個人會用自己的方法來打開自己的箱子。因此,3個箱子雖然各有不同,但它們同樣“都是箱子,可以打開蓋子”。這就是多態性的本質。
在編程中,“打開箱子”的命令,我們稱之為消息;而打開不同箱子的具體操作,我們稱之為方法。
在C++中,當類之間存在層次結構,並且類之間是通過繼承關聯時,就會用到多態。
下面的實例中,基類 Shape 被派生為兩個類,如下所示:
#include <iostream> using namespace std; class Shape { protected: int width, height; public: Shape( int a=0, int b=0) { width = a; height = b; } int area() { cout << "Parent class area :" <<endl; return 0; } }; class Rectangle: public Shape{ public: Rectangle( int a=0, int b=0):Shape(a, b) { } int area () { cout << "Rectangle class area :" <<endl; return (width * height); } }; class Triangle: public Shape{ public: Triangle( int a=0, int b=0):Shape(a, b) { } int area () { cout << "Triangle class area :" <<endl; return (width * height / 2); } }; // 程序的主函數 int main( ) { Shape *shape; Rectangle rec(10,7); Triangle tri(10,5); // 存儲矩形的地址 shape = &rec; // 調用矩形的求面積函數 area shape->area(); // 存儲三角形的地址 shape = &tri; // 調用三角形的求面積函數 area shape->area(); return 0; }
當上面的代碼被編譯和執行時,它會產生下列結果:
Parent class area Parent class area
導致錯誤輸出的原因是,調用函數 area() 被編譯器設置為基類中的版本,這就是所謂的靜態多態,或靜態鏈接 - 函數調用在程序執行前就準備好了。有時候這也被稱為早綁定,因為 area() 函數在程序編譯期間就已經設置好了。
但現在,讓我們對程序稍作修改,在 Shape 類中,area() 的聲明前放置關鍵字 virtual,如下所示:
class Shape { protected: int width, height; public: Shape( int a=0, int b=0) { width = a; height = b; } virtual int area() { cout << "Parent class area :" <<endl; return 0; } };
修改後,當編譯和執行前面的實例代碼時,它會產生以下結果:
Rectangle class area Triangle class area
此時,編譯器看的是指針的內容,而不是它的類型。因此,由於 tri 和 rec 類的對象的地址存儲在 *shape 中,所以會調用各自的 area() 函數。
正如您所看到的,每個子類都有一個函數 area() 的獨立實現。這就是多態的一般使用方式。有了多態,您可以有多個不同的類,都帶有同一個名稱但具有不同實現的函數,函數的參數甚至可以是相同的。
多態性的優點
前面說明了多態性,那麽它到底有什麽好處呢?
首先,各種數據可以統一地處理。多態性可以讓程序只關註要處理什麽(What),而不是怎麽去處理(How)。
其次,是根據對象的不同自動選擇最合適的方法,而程序內部則不發生沖突。不管調用有鎖的箱子,還是系著彩帶的箱子,它們都能自動處理,不用擔心調用中會發生錯誤,這樣就會減輕程序員的負擔。
再次,如果有新數據需要對應處理的話,通過簡單的追加就可以實現了,而不需要改動以前的程序,這就讓程序具備了擴展性。
綜上所述,多態性提高了開發效率,所以說,面向對象技術最重要的一個概念應該是多態性。
多態性、數據抽象和繼承被稱為面向對象編程的三原則。這三項原則通常也會有別的稱謂。
例如,把多態性稱為動態綁定,把數據抽象稱為信息隱藏或封裝,雖然名稱不同,但是內容都是相同的。許多人認為這些原則是面向對象程序設計的重要原則。
後面我們再談數據抽象和繼承。拜拜!
參考文獻:
松本幸弘的程序世界
菜鳥教程:http://www.runoob.com/cplusplus/cpp-polymorphism.html
C++-怎樣寫程序(面向對象)