除了上一節講到的類別物件在創建時自動呼叫的建構函數,在物件銷毀時也會自動呼叫一個函數,它也和類別名稱同名,也沒有傳回值,名字前有一個波浪線~ ,用來區分建構函數,它的作用主要是用做物件釋放後的清理善後工作。它就是析構函數。
與建構函數相同的是,與類別名稱相同,沒有傳回值,如果使用者不定義,系統也會自動產生一個空的析構函數。而一旦使用者定義,則物件在銷毀時會自動呼叫。
與構造函數不同的是,雖然他倆都為公開類型。構造可以重載,有多個兄弟,而析構卻不能重載,但它可以是虛函數,一個類別只能有一個析構函數。
下面,我們以Student類別為例,繼續加入析構函數,同時在建構子和析構函數中都加入了輸出目前類別的信息,用來辨別哪一個類別的創建和銷毀,請大家仔細閱讀程式碼:
#include<iostream>#include<Cstring>usingnamespacestd;classStudent{private:intnum;//學號charname[100];//名字intscore;//成績public:Student(intn,char*str,ints);~Student ();intprint();intSet(intn,char*str,ints);};Student::Student(intn,char*str,ints){num=n;strcpy(name,str);score=s;cout <<num<<<<name<<<<score<<;cout<<Constructor<<endl;}Student::~Student(){cout<<num<<<<name<<<<score<<; cout<<destructor<<endl;}intStudent::print(){cout<<num<<<<name<<<<score<<endl;return0;}intStudent::Set(intn,char*str,ints) {num=n;strcpy(name,str);score=s;}intmain(){StudentA(100,dot,11);StudentB(101,cpp,12);return0;}
請大家仔細理解上述程式碼中的建構函數和析構函數,並注意主函數中定義了兩個物件A和B,並親自上機測試,可以看到運行效果如下:
可以看到物件A和B的建構函數的呼叫順序以及析構函數的呼叫順序,完全相反!原因在於A和B對象同屬局部對象,也在棧區存儲,也遵循「先進後出」的順序!
請大家務必親自上機測試驗證結果!