在之前的博客中揍诽,我們介紹了構造函數(shù)和拷貝構造函數(shù)暑脆。他們的作用都是將對象進行初始化狐肢。今天,我要介紹在類中的另一種函數(shù)碟联,叫做析構函數(shù)僵腺。
析構函數(shù)的函數(shù)名為~+類名。和構造函數(shù)一樣普监,析構函數(shù)也是沒有返回值的琉兜,也不用寫void。但是由于它沒有任何參數(shù)廊散,所以它肯定是不能被重載的梧疲。若用戶沒有定義析構函數(shù)施符,那么系統(tǒng)會自動生成一個析構函數(shù),這個析構函數(shù)并不起任何作用浩销。
析構函數(shù)在對象被銷毀之前被自動調(diào)用,它的作用是將對象中的成員占用的內(nèi)存歸還給操作系統(tǒng)塘雳。為了觀察析構函數(shù)被調(diào)用的時機普筹,我們在析構函數(shù)下加上打印析構函數(shù)名的代碼太防,看它在控制臺中被打印出來的位置。
#include <iostream>
#include <string>
using namespace std;
class Student
{
public:
Student()
{
cout << "Student()" << endl;
}
~Student()
{
cout << "~Student()" << endl;
}
private:
string m_strName;
};
int main(void)
{
Student stu;
system("PAUSE");
return EXIT_SUCCESS;
}
我們寫了這樣的一串代碼讳嘱,在類中定義了構造函數(shù)和析構函數(shù)酿愧,由于我們沒有在函數(shù)定義里寫任何有實際意義的代碼,所以這兩個函數(shù)不起任何實際作用钝鸽,只是“刷一下存在感”庞钢,在調(diào)用的時候打印一行字。在main函數(shù)中仁连,我們只是實例化了一個對象阱穗,不對對象進行任何操作揪阶。
這個時候,我們看到炊苫,只調(diào)用了構造函數(shù),析構函數(shù)還是沒有被調(diào)用执虹。這時候唠梨,我們按下任意鍵。
可以看到茬故,在程序結束運行之后蚁鳖,析構函數(shù)被調(diào)用了出來醉箕。這就說明了,如果從棧中實例化一個對象垮庐,那么對象會在程序結束后被自動銷毀坞琴,內(nèi)存會被自動歸還,析構函數(shù)也在這個時候被調(diào)用寒亥。
那么荧关,如果是從堆中實例化對象,那么析構函數(shù)會在哪里被調(diào)用呢加勤?我們將main函數(shù)改成這樣同波。
int main(void)
{
Student* p = new Student();
delete p;
p = NULL;
system("PAUSE");
return EXIT_SUCCESS;
}
我們從堆中實例化了一個對象指針p,不進行任何操作未檩,直接釋放內(nèi)存戴尸,然后使指針懸空。我們看一下運行結果冤狡。
我們發(fā)現(xiàn)孙蒙,程序還沒有結束運行项棠,析構函數(shù)就已經(jīng)被調(diào)用。這也就說明了挎峦,從堆中實例化對象香追,在執(zhí)行delete的時候被手動銷毀,這個時候系統(tǒng)就會調(diào)用析構函數(shù)坦胶。
這一次翅阵,我們主要講解析構函數(shù)在什么時候會被調(diào)用,如果想知道析構函數(shù)如何發(fā)揮它真正的作用,我們會在用到對象成員指針的時候進行介紹滥崩。
以上就是此篇博客的內(nèi)容岖圈,下一篇:對象數(shù)組。