欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++深入講解對象的銷毀之析構函數

 更新時間:2022年04月18日 17:33:50   作者:清風自在 流水潺潺  
構造函數在創(chuàng)建對象時被系統(tǒng)自動調用,而析構函數(Destructor)在對象被撤銷時被自動調用,相比構造函數,析構函數要簡單的多

一、對象的銷毀

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

解決方案

  • 為每個類都提供一個 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(): %d\n", mi);
    }
    ~Test()
    {
        printf("~Test(): %d\n", mi);
    }
};
 
int main()
{
    Test t(1);
    
    Test* pt = new Test(2);
    
    delete pt;
    
    return 0;
}

輸出結果如下:

析構函數的定義準則

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

下面再來看一個實驗:

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

輸出結果如下:

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

三、小結

  • 析構函數是對象銷毀時進行清理的特殊函數
  • 析構函數在對象銷毀時自動被調用
  • 析構函數是對象釋放系統(tǒng)資源的保障

到此這篇關于C++深入講解對象的銷毀與析構函數的文章就介紹到這了,更多相關C++ 對象的銷毀內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Pipes實現LeetCode(192.單詞頻率)

    Pipes實現LeetCode(192.單詞頻率)

    這篇文章主要介紹了Pipes實現LeetCode(192.單詞頻率),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • C/C++實操True and false詳解

    C/C++實操True and false詳解

    這篇文章主要給大家介紹了關于Python中常用的數據類型bool(布爾)類型的兩個值:True和False的相關資料,通過示例代碼給大家進行了解惑,讓對這兩個值有所疑惑的朋友們能有起到一定的幫助,需要的朋友下面來一起看看吧。
    2021-09-09
  • C++中命名空間(namespace)詳解及其作用介紹

    C++中命名空間(namespace)詳解及其作用介紹

    考慮一種情況,當我們有兩個同名的人,Zara,在同一個班里。當我們需要對它們進行區(qū)分我們必須使用一些額外的信息和它們的名字,比如它們生活在不同的區(qū)域或者興趣愛好什么的,在C++程序中也會遇到同樣的情況,所以命名空間就此產生
    2022-08-08
  • C++實現圖書館案例

    C++實現圖書館案例

    這篇文章主要為大家詳細介紹了C++實現圖書館案例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 淺析C/C++中被人誤解的SIZEOF

    淺析C/C++中被人誤解的SIZEOF

    以下是對C/C++中的SIZEOF進行了詳細的分析介紹,需要的朋友參考下
    2013-07-07
  • C語言實現學生成績管理系統(tǒng)課程設計

    C語言實現學生成績管理系統(tǒng)課程設計

    這篇文章主要為大家詳細介紹了C語言實現學生成績管理系統(tǒng)課程設計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C語言實現共享單車管理系統(tǒng)

    C語言實現共享單車管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現共享單車管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++ min/max_element 函數用法詳解

    C++ min/max_element 函數用法詳解

    這篇文章主要介紹了C++ min/max_element 函數用法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Cocos2d-x觸摸事件實例

    Cocos2d-x觸摸事件實例

    這篇文章主要介紹了Cocos2d-x觸摸事件實例,本文代碼中包含大量注釋來說明Cocos2d-x中的觸摸事件使用示例,需要的朋友可以參考下
    2014-09-09
  • C語言編程之動態(tài)內存與柔性數組的了解

    C語言編程之動態(tài)內存與柔性數組的了解

    本文是C語言編程篇,這篇文章主要為大家介紹了C語言編程中動態(tài)內存的函數與柔性數組的特點,有需要的朋友可以借鑒參考下,希望可以有所幫助
    2021-09-09

最新評論