1. 程式人生 > >C++-怎樣寫程序(面向對象)

C++-怎樣寫程序(面向對象)

src 程序開發 發生 自己的 基礎 面向 排序 再次 我認

  使用編程語言寫好程序是有技巧的。

  主要編程技術:

  1. 編程風格

  2. 算法

  3. 數據結構

  4. 設計模式

  5. 開發方法

  編程風格指的是編程的細節,比如變量名的選擇方法、函數的寫法等。

  算法是解決問題的方法。現實中各種算法都已經廣為人知了,所以編程時的算法也就是對這些技巧的具體應用。有很多算法,如果單靠自己去想是很難想出來的。比方說數組的排序就有很多的算法,如果我們對這些算法根本就不了解,那麽要想做出高速排序程序會很困難。算法和特定的數據結構關系很大。

  所以有一位計算機先驅曾經說過:“程序就是算法加數據結構。”

  設計模式是指設計軟件時,根據以前的設計經驗對設計方法進行分類。

算法和數據結構從 廣義上來說也是設計模式的一種分類。有名的分類(設計模式)有23種(《《設計模式:可復用面向對象軟件的基礎》》)。

  開發方法是指開發程序時的設計方法,指包括項目管理在內的整個程序開發工程。小的軟件項目可能不是很明顯,在大的軟件項目中,隨著開發人員的增加,整個軟件工程的開發方法 就很重要。

  面向對象的編程方法

  下面,我們來看看Ruby的基本原理——面向對象的設計方法。面向對象的設計方法是20世紀60年代後期,在誕生於瑞典的Simula編程語言中最早開始使用的。Simula作為一種模擬語言,對於模擬的物體,引入了對象這種概念。比如說對於交通系統的模擬,車和信號就變成了對象。一輛輛車和一個個信號就是一個個對象,而用來 定義這些車和信號的,就是類

  如今,面向對象的設計思想已經相當重要且深入人心了,以後它的地位和重要性也應該不會降低。所以在學習編程語言時,對面向對象設計思想的理解就非常重要。

  但是,很多程序員覺得面向對象的設計思想很難,不容易理解,那麽它的難點在何處?

  面向對象的難點

  面向對象的難點在於,雖然有關於面向對象的說明和例子,但是面向對象具體的實現方法卻不是很明確。

  面向對象這個詞本身是很抽象的,越抽象的東西,人們就越難理解。並且對於面向對象這個概念,如果沒有嚴密的定義,不同的人就會有不同的理解。

  我認為面向對象編程語言中最重要的技術是“多態性”。我們就先從多態性說起吧。

  多態性

  多態性,英文是polymorphism

,其中詞頭poly-表示復數,morph表示形態,加上詞尾-ism,就是復數形態的意思,我們稱它為多態性。

  換個說法,多態就是可以把不同種類的東西當做相同的東西來處理

  只從字面上分析不容易理解,舉例說明一下。

  看看圖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++-怎樣寫程序(面向對象)