我們來學習新東西囉~
解構元(destruotor)與建構元一樣,都是C++裡一種特殊的函數,所不同的是它們的呼叫時機。建構元是在物件初次被建立時呼叫,而解構元恰好相反,巳是在物件已經不再需要而被銷毀(destroy)時呼叫。所謂的銷毀,指的是釋放物件原先所佔有的記憶空間。
解構元和建構元一檬,也是類別的成員之一。在C++裡,解構元的名稱和類別的名稱相同,但之前必須加上一個~
(tide)符號。此外,解構元没有傳回值,也不能傳入任何引數。下面為解構元的定義格式:
~類別名稱() //解構元的名稱必須和類別名稱相同
{
程式敘述;
....
}
我們所建立的物件均是由預設的解構元(default constructor)進行銷毀的動作。預設的解構元是由編譯器白動產生,當程式碼裡没有撰寫任何的解構元時,編譯器便會提供預設的解構元,這也就是到目前為止,前幾章所撰寫的程式還能順利執行的原因。
解構元到底在玩什麼把戲呢?我們舉個實例來做說明。下面的範例裡刻意的加入一個解構元,裡面包含一些程式碼,用來顯示出是哪一個物件的解構元被呼叫。若是程式裡已提供解構元,編譯器便會使用使用者自訂的版本,而不會使用預設的解構元。程式的撰寫如下:
//prog14_1,解構元的使用
#include <iostream>
#include <cstdlib>
using namespace std;
class CWin{ //定義視窗類別CWin
private:
char id;
int width, height;
public:
CWin(char i,int w,int h):id(i),width(w),height(h){
cout << "建構元被呼叫了..." << endl;
}
~CWin(){ //解構元
cout << "建構元被呼叫了,Win" << this->id << "被銷毀了.." << endl;
system("pause");
}
void show_member(void){
cout << "Window " << id << ": ";
cout << "width=" << width << ", height=" << height << endl;
}
};
int main(void){
CWin win1('A',50,40);
CWin win2('B',40,50);
CWin win3('C',60,70);
CWin win4('D',90,40);
win1.show_member();
win2.show_member();
system("pause");
return 0;
}
程式的結果如下:
解構元的開頭必須加上「~」符號,名稱與類別相同,且没有引數與傳回值。由於程式裡已提供這個解構元,因此編譯器會執行這個版本。當這個解構元被呼叫時,它會顯示出"解構元被呼叫了"字串,並且顯示出呼叫它之物件的id 成員。值得一提的是,程式中刻意加入system ("pause");
這行指令,用來暫停程式的執行。這是因為在main()主程式裡所建立的物件,在main()函數結束後,物件才會被銷毀,因此解構元是在main()結束後才會被呼叫。如果不加上這行,則程式執行完解構元後就自動關閉視窗,會因為速度太快而導致看不到畫面,因此加上這行來捕捉螢幕上的訊息。
各位再撐一下!