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

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

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

一、對象的銷毀

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

解決方案

  • 為每個類都提供一個 public 的 free 函數(shù)
  • 對象不再需要時立即調(diào)用 free 函數(shù)進行清理

如下:

存在的問題

  • free 只是一個普通的函數(shù),必須顯示的調(diào)用
  • 對象銷毀前沒有做清理,很可能造成資源泄漏

C++ 編譯器是否能夠自動調(diào)用某個特殊的函數(shù)進行對象的清理?

二、析構函數(shù)

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

  • 這個特殊的清理函數(shù)叫做析構函數(shù)
  • 析構函數(shù)的功能與構造函數(shù)相反

定義:~ClassName()

  • 析構函數(shù)沒有參數(shù)也沒有返回值類型聲明
  • 析構函數(shù)在對象銷毀時自動被調(diào)用

下面開始簡單使用析構函數(shù):

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

輸出結果如下:

t 雖然是對象,但是本質(zhì)上也是局部變量,在 return 0 之前會銷毀,t 被銷毀時析構函數(shù)會被自動調(diào)用。

下面再來看一個例子:

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

輸出結果如下:

析構函數(shù)的定義準則

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

下面再來看一個實驗:

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 輸出兩次,也就是說析構函數(shù)被自動調(diào)用兩次。

三、小結

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

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

相關文章

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

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

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

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

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

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

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

    C++實現(xiàn)圖書館案例

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

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

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

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

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

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

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

    C++ min/max_element 函數(shù)用法詳解

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

    Cocos2d-x觸摸事件實例

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

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

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

最新評論