【和春笋一起学C++】(三十七)类的析构函数
目录
1.、析构函数的作用和特性
2、实例
1.、析构函数的作用和特性
接上篇文章《【和春笋一起学C++】(三十六)类的构造函数》,用类的构造函数创建对象后,程序将跟踪该对象,直到对象过期。对象过期时,程序将自动调用一个特殊的函数——析构函数,用于完成清理工作。例如,在构造函数中使用new开辟了一块内存,则析构函数将使用delete来释放这些内存。
析构函数的名称也很特殊,在类名前加上“~”,如上篇文章中Student类的析构函数为~Student()。析构函数没有返回值和声明类型,也没有函数参数,因此对于Student类的析构函数的原型,它必须是~Student()。
那什么时候调用析构函数呢?一般是在对象的生命周期结束时,由系统自动调用析构函数。具体有以下几种情况:
- 如果创建的是静态存储类对象,则其析构函数在程序结束时自动被调用;
- 如果创建的是自动存储类对象,则其析构函数在代码块结束时自动被调用;
- 如果对象是通过new创建的,则当使用delete释放对象占用的内存时析构函数被自动调用;
如果类中没有提供析构函数,那么编译器将自动生成一个默认的析构函数。
原文为CSDN作者:三月微暖寻春笋
2、实例
将上篇文章中的Student类声明改为如下形式。
class Student
{
public:Student();Student(int yuwen_score_, int shuxue_score_, int yingyu_score_);~Student();void scoreSet(int yuwen_score_, int shuxue_score_, int yingyu_score_);int get_average_score();
private:std::string name;int *num;unsigned short yuwen_score;unsigned short shuxue_score;unsigned short yingyu_score;void show_score();
};
在私有数据成员中有一个int类的指针,使用默认构造函数对数据成员进行初始化如下:
Student::Student()
{name = "xxx";num = new int[8];for (int i = 0; i < 8; i++){num[i] = 0;}yuwen_score = 80;shuxue_score = 90;yingyu_score = 85;
}
默认构造函数中使用new开辟了占据8个int类型数据的内存空间,用于存储学生的学号。这段内存空间如果在析构函数中没有使用delete释放,则该类的自动存储类对象在代码块运行结束后,这段内存空间将不会被释放,从而导致内存泄露。所以,必须要在析构函数中使用delete来释放这段内存空间,不能使用编译器提供的默认析构函数。析构函数应定义为如下:
Student::~Student()
{delete[] num;
}