1、析构函数
析构函数,其实就是构造函数的相反操作,构造函数是创建对象时候,用来给对象的成员数据赋值的,而析构函数是用了清理对象的。
2、析构函数的特点
①析构函数就是位取反运算符+类名表示。
②构造函数可以有多个,而析构函数只能有一个,不可重载,不能有参数。
③与构造函数相同,析构函数没有返回值。如果没有显式写出析构函数,编译器会自动加上一个默认的析构函数,如果写了的话,就不会再加。
#include<bits/stdc++.h>
using namespace std;
class Point{
public:
Point(double xx=0.0,double yy=0.0);
~Point();
void get();
private:
double x,y;
};
Point::Point(double xx,double yy):x(xx),y(yy){
}
Point::~Point(){
cout<<"end"<<endl;
}
void Point::get(){
cout<<"x="<<x<<" y="<<y<<endl;
}
int main(){
Point a(5.0,6.0);
a.get();
return 0;
}
3、析构函数被调用的情况
①对象的生命周期结束。(比如在函数中的声明 函数结束前会调用)
void fun(){
Point a(5.0,6.0);
}
int main(){
fun();
return 0;
}
②如果对象是new出来的,用delete释放空间时候会调用。不手动delete是不会调用析构函数的。
int main(){
Point *a=new Point(6.0,7.0);
delete a;
return 0;
}
③对象a是对象b的成员,对象b的析构函数被调用时候,对象a的析构函数也会被调用。
#include<bits/stdc++.h>
using namespace std;
class Point{
public:
Point(double xx=0.0,double yy=0.0);
~Point();
void get();
private:
double x,y;
};
Point::Point(double xx,double yy):x(xx),y(yy){
}
Point::~Point(){
cout<<"Point end"<<endl;
}
void Point::get(){
cout<<"x="<<x<<" y="<<y<<endl;
}
class Line{
public:
Line();
~Line();
private:
Point point;
};
Line::Line(){
}
Line::~Line(){
cout<<"Line end"<<endl;
}
class test{
public:
test();
~test();
private:
Line line;
};
test::test(){
}
test::~test(){
cout<<"test end"<<endl;
}
int main(){
test A;
return 0;
}
4、总结
析构函数不仅仅是用来清理对象释放内存的,也可以是在析构函数中编写在清理对象前需要做的一些工作。