2-2 視野解析運算子


阿瑟 發表



視野解析運算子 (Scope Resolution Operator) 是一個設計物件導向程式時的利器, 小弟將在這篇教學中加以介紹.

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

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



在開始之前小弟先複習一下上次的程式碼:

#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");
}

不知道您有沒有一個感覺: 好像class的內容有點太多了.

如果要將程式碼弄得更容易閱讀, 您可以將class改成:

class numbers
{
   private:
   int number1;
   double number2;

   public:
   numbers();
   ~numbers();
   void output();
};

這種class的寫法就是所謂的標頭 (Header), 他只會將所有的成員列出來, 而不會深入討論其內容.

你可能會問: 那函式的內容怎麼辦?
呵呵, 這就是今天要討論的重點囉!

溫習一下先前提過的私有 (private)性質, 在類別中在私有的變數只能被類別中的其他成員存取, 因此不管怎麼樣一定得利用類別中的函式來存取.

由於讓class更容易閱讀, 小弟在上面將他改成的標頭的形式, 這也意味著我們必須在該類別以外的地方進行函式的寫作, 這就要提到如何解決變數視野的問題. 由於在類別中的私有變數, 視野 (scope) (即可用範圍) 被限制在類別中, 因此我們需要用到 視野解析運算子 (scope resolution operator) 來解決視野問題. (這個名稱是直譯的, 小弟不是很確定正式的中文名稱是什麼, 有興趣的人可以拿英文去找找看對應的中文名詞).

先來看看這一個函式標頭:
void numbers::output()

這個函式標頭與之前寫過的函式我想最大的不同就是中間的 :: , 沒錯, 這就是視野解析運算子. 運算子的前面是類別名稱, 後面則是類別內的函式名稱. 利用這種寫法可以讓你在類別外的地方進行numbers類別中的output()函式的寫作工作.

來看一下改寫後的一個範例:

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

class numbers
{
   private:
   int number1;
   double number2;

   public:
   numbers();
   ~numbers();
   void output();
};


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

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

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


void main()
{
   numbers a;

   a.output();

   system("PAUSE");
}

編譯並且執行此程式, 您應該會看到相同的輸出

程式邏輯並沒有改變, 只是寫的方法變了.
利用視野解析運算子寫作的函式, 其環境就跟直接在類別中寫作一樣, 不用特別去註明是什麼類別或是物件. (不需要a.number1這種指定方式)

講到這邊別忘了多練習喔, 小弟在下個章節會利用一個範例實作來討論物件導向程式設計與傳統程式設計的不同之處.

最後更新日期: 5/28/2003 4:25:09 PM