首頁 > 軟體

C++深入講解物件的銷燬之解構函式

2022-04-18 22:00:45

一、物件的銷燬

  • 生活中的物件都是被初始化後才上市的
  • 生活中的物件被銷燬前會做一些清理工作
  • —股而言,需要銷燬的物件都應該做清理

解決方案

  • 為每個類都提供一個 public 的 free 函數
  • 物件不再需要時立即呼叫 free 函數進行清理

如下:

存在的問題

  • free 只是一個普通的函數,必須顯示的呼叫
  • 物件銷燬前沒有做清理,很可能造成資源洩漏

C++ 編譯器是否能夠自動呼叫某個特殊的函數進行物件的清理?

二、解構函式

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

  • 這個特殊的清理函數叫做解構函式
  • 解構函式的功能與建構函式相反

定義:~ClassName()

  • 解構函式沒有引數也沒有返回值型別宣告
  • 解構函式在物件銷燬時自動被呼叫

下面開始簡單使用解構函式:

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

輸出結果如下:

t 雖然是物件,但是本質上也是區域性變數,在 return 0 之前會銷燬,t 被銷燬時解構函式會被自動呼叫。

下面再來看一個例子:

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

輸出結果如下:

解構函式的定義準則

當類中自定義了建構函式,並且建構函式中使用了系統資源(如∶記憶體申請,檔案開啟,等) ,則需要自定義解構函式。

下面再來看一個實驗:

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 itn");
 
    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] = %dn", i, value);
        }
    }
    
    IntArray b = a;
    
    for(int i=0; i<b.length(); i++)
    {
        int value = 0;
        
        if( b.get(i, value) )
        {
            printf("b[%d] = %dn", i, value);
        }
    }
    
    return 0;
}

輸出結果如下:

可以看到 do it 輸出兩次,也就是說解構函式被自動呼叫兩次。

三、小結

  • 解構函式是物件銷燬時進行清理的特殊函數
  • 解構函式在物件銷燬時自動被呼叫
  • 解構函式是物件釋放系統資源的保障

到此這篇關於C++深入講解物件的銷燬與解構函式的文章就介紹到這了,更多相關C++ 物件的銷燬內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com