析构函数
析构函数是构造函数的逆操作。构造函数是从内存中获取空间供程序使用,当一个对象不用了时,也要将其占用的空间归还,这就要用到析构函数。
析构函数在类名之前加~来命名,它不允许有返回值,也不允许带参数,并且一个类只能有一个析构函数。如果一个对象在一个函数体内定义,那么在函数执行结束后,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类的对象,通过输出看一下构造和析构的顺序。