當一個對象的生命周期結束時,我們應該去釋放這個對象所占有的資源,這可以利用析構函數來完成。析構函數的定義格式為:~類名(),如:~point()。
析構函數是“反向”的構造函數。析構函數不允許有返回值,更重要的是析構函數不允許帶參數,並且一個類中只能有一個析構函數。析構函數的作用正好與構造函數相反,析構函數用於清除類的對象。當一個類的對象超出它的作用范圍,對象所在的內存空間被系統回收,或者在程序中用delete刪除對象時,析構函數將自動被調用。對一個對象來說,析構函數是最後一個被調用的成員函數。
根據析構函數的這種特點,我們可以在構造函數中初始化對象的某些成員變量,為其分配內存空間(堆內存),在析構函數中釋放對象運行期間所申請的資源。
例如,下面這段程序:
class Student
{
private:
char *pName;
public:
Student()
{
pName=new char[20];
}
~Student()
{
delete[] pName;
}
};
在Student類的構造函數中,給字符指針變量pName在堆上分配了20個字符的內存空間,在析構函數中調用delete,釋放在堆上分配的內存。如果沒有delete[] pName這句代碼,當我們定義一個Student的對象,在這個對象生命周期結束時,在它的構造函數中分配的這塊堆內存就會丟失,造成內存洩漏。
提示:在類中定義成員變量時,不能直接給成員變量賦初值。例如:
class point
{
int x=0;//錯誤,此處不能給變量x賦值。
int y;
};