C++程式設計雜談:物件導向 (轉)

worldblog發表於2008-01-05
C++程式設計雜談:物件導向 (轉)[@more@]  開發是一個極其複雜的過程,一段小的程式碼我們可以、準確的完成,但是當你面對的是一個龐大的軟體的時候,你是否有不知所措的感覺呢?
  在我們使用C的年代裡面,思想是結構化的,你的C語言老師可能會不斷的教導你怎樣使用結構化的方法來完成一段,同時,你可能也知道在軟體開發中的一個重要定律(Wirth定律):
程式 = 演算法 + 資料結構
在結構化設計中人們通常是這樣來看待這個定律的:
  程式 =(演算法) + (資料結構)
例如:(我仍然使用C++標準庫來寫下面的程式碼,方便和以後的程式碼對比)

#include using namespace std ; typedef struct Student { char strname[50]; //姓名 int math; //數學分數 int chinese; //語文 int total; //總分 }STUDENT; void InitData(STUDENT* some) { ////////////////////////////////////// //初始化資料 some->strname[0] = ''; some->math = 0; some->chinese = 0; some->total = 0; } void InputData(STUDENT* some) { /////////////////////////////////////// //獲取輸入 cout<>some->strname; cout<>some->math; cout<>some->chinese; ////////////////////////////////////// //計算總分 some->total = some->math + some->chinese; } void PrintData(STUDENT some) { cout<到目前為止,程式的劃分變得相對簡單了,團隊的開發才成為可能。在面向中,所存在的Wirth定律與上面的結構非常類似:
  物件 = (演算法 + 資料結構)
  程式 = 物件 + 物件
  表面上似乎二者之間並沒有太大的差別,但就是這個差別為我們帶來了巨大的變革。
  有這樣一句話:“程式設計是在中反映世界”,我覺得再貼切不過,物件導向(-Oriented)對這種說法的體現也是最優秀的,比如在前面的例子中,我們設計的資料結構是一個學生成績的表現,而對資料結構的操作()是分離的,雖然這些操作是針對這種資料結構而產生的。為了管理大量的資料,我們不得不小心翼翼地使用它們。
  物件導向中一個重要的概念就是類(class)C++中是它。類和struct資料結構最大的不同就是提供了限制級別(可見性)的保護——我們先拋開復雜的繼承與多型不談。正是透過這種方式,我們可以對資料成員提供非常有效的保護,同時使資料結構更符合現實行為。
  在物件導向的概念中,前面的資料結構表示如下:

  #include   using namespace std;   class Student   {   private:    //屬性   char strname[50]; //姓名   int math; //數學分數   int chinese; //語文   int total; //總分  public:   //方法   char* getname(){ return strname; };    int getmath(){ return math; };    int getchinese(){ return chinese; };    int gettotal(){ return total; };    Student();    void InputData();    void PrintData();   };     Student::Student()   {    //////////////////////////////////////    //初始化資料   strname[0] = '';    math = 0;    chinese = 0;    total = 0;   }     void Student::InputData()   {    ///////////////////////////////////////    //獲取輸入   cout<>strname;    cout<>math;    cout<>chinese;      //////////////////////////////////////    //計算總分   total = math + chinese;   }     void Student::PrintData()   { cout<     我們先不去關心類的實現細節,現在對比一下main函式中的過程,每種方法和相應的資料結構聯絡在了一起,對外部的呼叫來說,我們不需要去關心資料結構和相應演算法的關係,因為他們已經關聯在了一起。也許這個例子不夠說明問題,也許我的說明含糊不清,但是你想象一下:如果我們對一個物體,比如狗來建模,我們需要確定其屬性(顏色、大小)和行為(跑、叫),我們肯定希望這些都與狗這個模型關聯在一起:

Class dog (屬性) Color Size (行為) Run yelp 如果是結構話的: Struct dog Color Size (依賴關係)  Run(dog somedog) yelp(dog somedog)  

  顯然後面的結構比較複雜,更不要說缺乏有效的成員屬性保護。另外一個物件導向的強大就是繼承與多型,下一篇我們再來討論。
 我希望我前面的表達足夠的清楚,物件導向不是這樣一篇文章可以描述的清楚的,我這裡只是描述了一個發展過程的片面。我希望它能成為一個引子,能夠為初學者提供一些幫助。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-996551/,如需轉載,請註明出處,否則將追究法律責任。

相關文章