C++解構函式

熊一帆發表於2019-05-10

為什麼有這玩意

主要作用:釋放new出來的空間

class Person{
public:
    int * scores;
    Person() {
        // new出來的這部分空間不會被自動釋放
        scores = new int[5];
    }
    // 下面這個函式,會在物件消亡時自動呼叫,釋放掉new出的空間
    ~Person() {
        delete []scores;
    }
};

定義

  • ~類名(){}

  • 沒有返回值,沒有引數

  • 只能有一個

  • 自定義解構函式後,就不再生成預設的解構函式。預設的解構函式,不會釋放new出的記憶體空間。

~Person() {
    // ...
}

呼叫時機

  • 在一個類生成物件時,會呼叫建構函式。在一個物件消亡的時,會呼叫解構函式

#include <iostream>
#include <stdio.h>

using namespace std;

class Demo {
    int id; public:
    Demo( int i ) {
        id = i;
        cout << "id=" << id << " Constructed" << endl; }
    ~Demo() {
        cout << "id=" << id << " Destructed" << endl; }
};

Demo d1(1); // 全域性變數,最先建立

void Func(){
    static Demo d2(2); // 靜態區域性變數,從函式呼叫時生成,在整個程式結束時,88
    Demo d3(3); // 區域性變數
    cout << "Func" << endl;
}

// 建立完全域性變數後,進入main函式
int main (){
    Demo d4(4); // 區域性變數
    d4 = 6; // 型別轉換建構函式,相當於,d4 = Demo(6); Demo(6)是一個臨時變數,建立完賦值給d4,然後就88了
    cout << "main" << endl;
    { Demo d5(5); } // 區域性程式碼塊,作用域就在大括號中,所以建立完,程式碼塊執行完,就88了
    Func();
    cout << "main ends" << endl;
    return 0;
}

參考:C++程式設計 3.2.3 解構函式

相關文章