析構(gòu)函數(shù)

在之前的博客中,我們介紹了構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)。他們的作用都是將對(duì)象進(jìn)行初始化。今天,我要介紹在類中的另一種函數(shù),叫做析構(gòu)函數(shù)。

析構(gòu)函數(shù)的函數(shù)名為~+類名。和構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也是沒(méi)有返回值的,也不用寫(xiě)void。但是由于它沒(méi)有任何參數(shù),所以它肯定是不能被重載的。若用戶沒(méi)有定義析構(gòu)函數(shù),那么系統(tǒng)會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù),這個(gè)析構(gòu)函數(shù)并不起任何作用。

析構(gòu)函數(shù)在對(duì)象被銷毀之前被自動(dòng)調(diào)用,它的作用是將對(duì)象中的成員占用的內(nèi)存歸還給操作系統(tǒng)。為了觀察析構(gòu)函數(shù)被調(diào)用的時(shí)機(jī),我們?cè)谖鰳?gòu)函數(shù)下加上打印析構(gòu)函數(shù)名的代碼,看它在控制臺(tái)中被打印出來(lái)的位置。

#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;
}

我們寫(xiě)了這樣的一串代碼,在類中定義了構(gòu)造函數(shù)和析構(gòu)函數(shù),由于我們沒(méi)有在函數(shù)定義里寫(xiě)任何有實(shí)際意義的代碼,所以這兩個(gè)函數(shù)不起任何實(shí)際作用,只是“刷一下存在感”,在調(diào)用的時(shí)候打印一行字。在main函數(shù)中,我們只是實(shí)例化了一個(gè)對(duì)象,不對(duì)對(duì)象進(jìn)行任何操作。


運(yùn)行結(jié)果1_1

這個(gè)時(shí)候,我們看到,只調(diào)用了構(gòu)造函數(shù),析構(gòu)函數(shù)還是沒(méi)有被調(diào)用。這時(shí)候,我們按下任意鍵。


運(yùn)行結(jié)果1_2

可以看到,在程序結(jié)束運(yùn)行之后,析構(gòu)函數(shù)被調(diào)用了出來(lái)。這就說(shuō)明了,如果從棧中實(shí)例化一個(gè)對(duì)象,那么對(duì)象會(huì)在程序結(jié)束后被自動(dòng)銷毀,內(nèi)存會(huì)被自動(dòng)歸還,析構(gòu)函數(shù)也在這個(gè)時(shí)候被調(diào)用。

那么,如果是從堆中實(shí)例化對(duì)象,那么析構(gòu)函數(shù)會(huì)在哪里被調(diào)用呢?我們將main函數(shù)改成這樣。

int main(void)
{
    Student* p = new Student();
    delete p;
    p = NULL;
    system("PAUSE");
    return EXIT_SUCCESS;
}

我們從堆中實(shí)例化了一個(gè)對(duì)象指針p,不進(jìn)行任何操作,直接釋放內(nèi)存,然后使指針懸空。我們看一下運(yùn)行結(jié)果。


運(yùn)行結(jié)果2

我們發(fā)現(xiàn),程序還沒(méi)有結(jié)束運(yùn)行,析構(gòu)函數(shù)就已經(jīng)被調(diào)用。這也就說(shuō)明了,從堆中實(shí)例化對(duì)象,在執(zhí)行delete的時(shí)候被手動(dòng)銷毀,這個(gè)時(shí)候系統(tǒng)就會(huì)調(diào)用析構(gòu)函數(shù)。

這一次,我們主要講解析構(gòu)函數(shù)在什么時(shí)候會(huì)被調(diào)用,如果想知道析構(gòu)函數(shù)如何發(fā)揮它真正的作用,我們會(huì)在用到對(duì)象成員指針的時(shí)候進(jìn)行介紹。

以上就是此篇博客的內(nèi)容,下一篇:對(duì)象數(shù)組。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容