C++编程入门(二) 互动版

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器

析构函数

析构函数是构造函数的逆操作。构造函数是从内存中获取空间供程序使用,当一个对象不用了时,也要将其占用的空间归还,这就要用到析构函数。

析构函数在类名之前加~来命名,它不允许有返回值,也不允许带参数,并且一个类只能有一个析构函数。如果一个对象在一个函数体内定义,那么在函数执行结束后,C++编译器自动调用该对象的析构函数。你要是没有定义析构函数,C++也会给你自动生成析构函数。

如果对象的创建是通过new操作的,那么用delete掉这个对象的时候,C++默认调用了析构函数。上例子:

#include <iostream>
using namespace std;
class Point
{
    public:
        Point(Point &point){x=point.x;y=point.y;}//声明并实现拷贝构造函数
        Point(int a,int b=3){x=a;y=b;}//声明并实现构造函数
        ~Point(){cout<<"delete"<<x<<" "<<y<<endl;}//声明并实现析构函数
        void setXY(int a,int b){x=a;y=b;}
        void move(int a,int b){x+=a;y+=b;}
        void printPoint(){cout<<"x= "<<x<<" y= "<<y<<endl;}
        int getX(){return x;}
        int getY(){return y;}
    private:
        int x,y;
};
void main()
{
    Point p1,p2(3);
    p1.setXY(1,2);
}

第8行声明并实现析构函数,在析构函数中进行打印。

有同学说析构函数的声明和实现我看到了,但调用在哪里,我怎么没看到?听我细细讲来:main函数中声明了Point类的2个对象,创建p1时调用了默认构造函数,创建p2是调用了第7行的构造函数。

对象p1和p2是在main函数中定义的,所以main函数执行结束后,在第21行'}'的地方C++编译器自动调用了两个对象的析构函数,打印了下面两句话:

delete 3 3

delete 1 2

能看出来是先调用的p2的析构函数,再调用的p1的析构函数。所以是后声明的对象先析构,先声明的对象后析构。

在右侧代码框中编写程序:定义一个Student类,在构造函数和析构函数中进行输出。在main函数中定义Student类的对象,通过输出看一下构造和析构的顺序。