1-8 Struct 類別與物件


阿瑟 發表



我想C++最引人入勝之處就是他引入的物件導向程式設計. 而在真正去探索物件導向程式設計之前, 小弟要先介紹struct這個資料結構, 他可是C++中物件導向的前身喔.

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

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



C++的特色就是採用了較多的物件導向來讓程式設計模組化, 而什麼是物件導向 (Object Oriented) 呢?
物件導向就是以物件 (Objects)的理念來寫程式, 讓程式的各部份以一個個的 物件實體 (object instance)  來與其他的部分互動, 讓寫程式不再只是一段段欠整理的程式碼.

今天會講到的struct保留字, 其實代表的就是structure, 及結構之意, 指的當然是資料結構囉.

先來看個範例:



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

struct numbers
{
   int number1;
   double number2;
};


void main()
{
   numbers a;
   a.number1 = 5;
   a.number2 = 5.5;

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

   system("PAUSE");
}



編譯並且執行這隻程式.

小弟先簡單講解一下, struct這種資料結構與陣列第一個不同就是他可以含有不同資料型態的變數. 如此例中的number1 (整數) 與 number2 (浮點數).

資料結構說簡單一點其實就是自訂的資料型態, 因此宣告方法與一般的資料型態並無不同, 如此例中的 numbers a; 就是宣告了一個名稱 (identifier) 為 a的物件.

在這個範例中, numbers其實就像是一個藍本, 而a是成品. 正式的說法, number是一個類別 (class), 而 a 則是一個物件 (object), 也稱為  實體 (Instance) .

而所有以numbers為底本的物件, 都會有number1 與 number2 兩個成員. 這隻程式後面應該不難了解, 指定數值給這兩個成員並且輸出

另外直得注意的一點就是, struct與函數的大括號不同, 大括號後面必須加上分號 ";" 不然會出現編譯錯誤


struct還不能算是純種的類別 (class), 因為他仍是C語言的產物, 不過要了解C++下的類別, 必須從struct講起.

剛剛提過struct是底本, 可以利用這個底本來創造物件.

每個物件都有初始 (construct)終結 (destruct)兩個程序, 其作用就看字面上的意思囉.

初始函式 (constructor)終結函式 (destructor) 兩個函式分別會在物件初始和終結時執行, 剛剛的範例並沒有包含這兩個函式, 小弟在接下來這個範例中補上了:



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

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


這個範例的numbers類別裡面多了兩個函式, numbers()與~numbers(), 兩個與類別同名稱的函式, numbers()是初始函式, ~numbers()則是終結函式, 這兩個函式都是沒有型態的 (沒有void, int, double這類的型態)

仔細看看這範例和上面的範例, 沒錯, 小弟把後來指定數值給成員number1與number2的部分放到初始函式裡面, 當物件被創造的時候就會自動指定這兩個數值給其成員.

有些細心的網友大概已經看到, 在初始函式中的部分, 小弟並沒有寫 a.number1 = 5, 而是直接用 number1 = 5來指定. 這個就要談到 變數視野 (variable scope), 也就是變數可以使用的範圍. number1 與 number2 兩成員是在numbers類別中宣告的, 而初始函式numbers()亦是在同一類別中宣告的, 兩者的視野相同因此可以直接以名稱 (identifier) 來存取.

如果今天你是從主函數 void main() 去存取 number1 與 number2 的話, 那你就必須指定 a.number1, 因為在void main()與其同視野的變數中並沒有 number1 這個變數, 您必須指定物件.

*注意: 有些人常常會把類別名稱和物件名稱搞錯了, 如宣告了 a 這個物件, 有些人會打 numbers.number1 去存取 number1 成員, 這是錯誤的, numbers在這個範例中是類別不是物件.


以上就是類別與資料結構的基本概念, 為了不讓文章太長, 小弟在這邊先停筆. 類別和物件的概念其實並不容易, 您看到這邊可能覺得這些沒有什麼用, 或是已經暈頭轉向, 這些都是正常現象. 等小弟在接下來的幾篇教學會放一些較實用的範例來幫助大家學習.   

最後更新日期: 5/26/2003 5:45:56 PM