为什么有这玩意

主要作用:释放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 析构函数


熊一帆
96 声望14 粉丝