2-1 Class與物件導向


阿瑟 發表



講到了class (類別)也代表我們進入了一個新的章節, 一個物件導向的C++章節.

*注意: C++所有語法大小寫有差. 如果您在執行時發現中文無法顯示請自行將程式修改成英文.

*注意: 如果您執行程式後, 程式視窗會自動關閉的話, 請至MS-DOS模式重新執行程式, 或是在void main()最底端加上system("PAUSE");來暫停程式.



上次介紹的struct是在C語言就已經有的保留字. 到了C++, 為了讓物件導向的設計理念更完整於是將struct改進成為了class, 也就是類別. 從這章開始小弟將不會再使用struct, 感用class來講解.

在看範例之前小弟先講解一下物件導向的理念: 物件導向就是將程式分割為多個物件來操作. class保留字和struct一樣, 會提供物件創造用的藍本. 每個物件裡面都有成員, 舉個例子, 一棟房子如果是一個物件, 他的成員可能有門, 窗, 家具等. 如果照傳統的寫法, 要操作這個房子裡面的成員是很複雜的. 如果使用物件導向的理念來設計, 您可以利用一個叫做"房子"的類別來創造一個房子的實體, 然後對其成員進行動作.

物件導向程式設計 (Object Oriented Programming) 帶來最大的好處就是讓程式碼更容易閱讀以及管理.

這次用到的class其實和struct並沒有什麼不同, 小弟把上次的範例中的struct改成class, 看看執行結果:



#include <iostream.h>
#include <stdlib.h>

class numbers
{
   int number1;
   double number2;

   numbers()
   {
      number1 = 5;
      number2 = 5.5;
   }

   ~numbers()
   {
      cout << "一個numbers類別的物件被終結了" << endl;
   }
};


void main()
{
   numbers a;

   cout << a.number1 << endl;
   cout << a.number2 << endl;

   system("PAUSE");
}


編譯後執行, 您看到了什麼輸出呢?

路人甲: 跟上次一樣!
阿得: 跟上次一樣才有鬼
路人甲: ???
阿得: 被我逮到了, 沒有實際去試喔! 沒錯, 這段程式碼是錯誤的!

編譯以後您應該會看到錯誤 "cannot access private data members" , 也就是無法存取私有成員.

為什麼呢?

在上一篇教學中介紹的struct由於預設的所有成員屬性皆為 公開 (public) 因此小弟並沒有討論成員的屬性. 而這次使用的class就不同了, class保留字的預設成員屬性為 私有 (private).

什麼是私有和公開呢?

私有 代表的是該成員的存取權限限制於該類別內的其他成員, 外界是無法直接存取的. 如果用類別創造物件, 該物件內私有的成員也只能被物件內的成員存取.
公開 代表的是該成員的存取權涵蓋了外界物件, 外界物件可以直接存取.
class較struct注重安全性, 多數程式設計師都將函式設定為公開, 而變數設定為私有, 這麼做是為了別人隨便竄改變數內容.

將剛剛的範例改一下:



#include <iostream.h>
#include <stdlib.h>

class numbers
{
   private:
   int number1;
   double number2;

   public:
   numbers()
   {
      number1 = 5;
      number2 = 5.5;
   }

   ~numbers()
   {
      cout << "一個numbers類別的物件被終結了" << endl;
   }

   void output()
   {
      cout << number1 << endl;
      cout << number2 << endl;
   }
};


void main()
{
   numbers a;

   a.output();

   system("PAUSE");
}

編譯並且執行, 您應該會看到與上次相同的輸出

為了保護變數, 小弟將number1與number2兩個成員放在私有的部分. 由於外界無法直接輸出兩個變數, 因此小弟另外在class中寫了一個output()函式來輸出number1與number2的數值. 由於numbers類別中所有的函式都有被外界存取的可能, 因此都放在公開的部分.

至於主函式 void main()的部分, 小弟將原本從物件中輸出number1與number2的部分改成了呼叫函式 a.output(), a是一個用numbers類別創造的物件實體 (instance).


小弟今天寫到這裡也要先停筆了, 下幾回再做詳細的class介紹

最後更新日期: 5/27/2003 2:36:17 PM