溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++對象的銷毀之析構函數實例分析

發(fā)布時間:2022-04-19 09:09:32 來源:億速云 閱讀:166 作者:iii 欄目:開發(fā)技術

本文小編為大家詳細介紹“C++對象的銷毀之析構函數實例分析”,內容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“C++對象的銷毀之析構函數實例分析”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。

一、對象的銷毀

  • 生活中的對象都是被初始化后才上市的

  • 生活中的對象被銷毀前會做一些清理工作

  • —股而言,需要銷毀的對象都應該做清理

解決方案

  • 為每個類都提供一個 public 的 free 函數

  • 對象不再需要時立即調用 free 函數進行清理

如下:

C++對象的銷毀之析構函數實例分析

存在的問題

  • free 只是一個普通的函數,必須顯示的調用

  • 對象銷毀前沒有做清理,很可能造成資源泄漏

C++ 編譯器是否能夠自動調用某個特殊的函數進行對象的清理?

二、析構函數

C++ 的類中可以定義一個特殊的清理函數

  • 這個特殊的清理函數叫做析構函數

  • 析構函數的功能與構造函數相反

定義:~ClassName()

  • 析構函數沒有參數也沒有返回值類型聲明

  • 析構函數在對象銷毀時自動被調用

下面開始簡單使用析構函數:

#include <stdio.h>
 
class Test
{
public:
    Test()
    {
        printf("Test()\n");
    }
    ~Test()
    {
        printf("~Test()\n");
    }
};
 
int main()
{
    Test t;
    
    return 0;
}

輸出結果如下:

C++對象的銷毀之析構函數實例分析

t 雖然是對象,但是本質上也是局部變量,在 return 0 之前會銷毀,t 被銷毀時析構函數會被自動調用。

下面再來看一個例子:

#include <stdio.h>
 
class Test
{
    int mi;
public:
    Test(int i)
    {
        mi = i;
        printf("Test(): %d\n", mi);
    }
    ~Test()
    {
        printf("~Test(): %d\n", mi);
    }
};
 
int main()
{
    Test t(1);
    
    Test* pt = new Test(2);
    
    delete pt;
    
    return 0;
}

輸出結果如下:

C++對象的銷毀之析構函數實例分析

析構函數的定義準則

當類中自定義了構造函數,并且構造函數中使用了系統資源(如∶內存申請,文件打開,等) ,則需要自定義析構函數。

下面再來看一個實驗:

IntArray.h:

#ifndef _INTARRAY_H_
#define _INTARRAY_H_
 
class IntArray
{
private:
    int m_length;
    int* m_pointer;
public:
    IntArray(int len);
    IntArray(const IntArray& obj);
    int length();
    bool get(int index, int& value);
    bool set(int index ,int value);
    ~IntArray();
};
 
#endif

IntArray.cpp:

#include "IntArray.h"
#include "stdio.h"
 
 
 
IntArray::IntArray(int len)
 
{
 
    m_pointer = new int[len];
 
    
 
    for(int i=0; i<len; i++)
 
    {
 
        m_pointer[i] = 0;
 
    }
 
    
 
    m_length = len;
 
}
 
 
 
IntArray::IntArray(const IntArray& obj)
 
{
 
    m_length = obj.m_length;
 
    
 
    m_pointer = new int[obj.m_length];
 
    
 
    for(int i=0; i<obj.m_length; i++)
 
    {
 
        m_pointer[i] = obj.m_pointer[i];
 
    }
 
}
 
 
 
int IntArray::length()
 
{
 
    return m_length;
 
}
 
 
 
bool IntArray::get(int index, int& value)
 
{
 
    bool ret = (0 <= index) && (index < length());
 
    
 
    if( ret )
 
    {
 
        value = m_pointer[index];
 
    }
 
    
 
    return ret;
 
}
 
 
 
bool IntArray::set(int index, int value)
 
{
 
    bool ret = (0 <= index) && (index < length());
 
    
 
    if( ret )
 
    {
 
        m_pointer[index] = value;
 
    }
 
    
 
    return ret;
 
}
 
 
 
IntArray::~IntArray()
 
{
    printf("do it\n");
 
    delete[]m_pointer;
 
}

main.cpp:

#include <stdio.h>
#include "IntArray.h"
 
int main()
{
    IntArray a(5);    
    
    for(int i=0; i<a.length(); i++)
    {
        a.set(i, i + 1);
    }
    
    for(int i=0; i<a.length(); i++)
    {
        int value = 0;
        
        if( a.get(i, value) )
        {
            printf("a[%d] = %d\n", i, value);
        }
    }
    
    IntArray b = a;
    
    for(int i=0; i<b.length(); i++)
    {
        int value = 0;
        
        if( b.get(i, value) )
        {
            printf("b[%d] = %d\n", i, value);
        }
    }
    
    return 0;
}

輸出結果如下:

C++對象的銷毀之析構函數實例分析

可以看到 do it 輸出兩次,也就是說析構函數被自動調用兩次。

讀到這里,這篇“C++對象的銷毀之析構函數實例分析”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI