c++类和对象之析构函数

一、析构函数

在上一篇文章中,我们介绍了对象的初始化工作。详情请参考
对象的初始化即构造函数
下面来介绍以下析构函数。
类型:
~类名(){};
析构函数也是一种特殊的成员函数,它的作用与析构函数相反,当对象的生命周期介绍时,会自动调用析构函数。具体来说出现以下四种情况,程序会执行析构函数
1.如果在一个函数中定义了一个对象(假设是局部对象),当这个函数调用结束时,对象应该释放,在对象释放前自动执行析构函数。
2.静态局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数调用结束或者调用exit函数结束程序时,才调用自动静态局部对象的析构函数。
3.如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数调用结束或者调用exit函数结束程序),自动调用该全局对象的析构函数。
4.如果用new运算符动态建立一个对象,当用delete运算符释放该对象时,先自动调用该对象的析构函数。
注意:
1.构造函数的作用并不是删除对象,而是在撤销对象占用的内存空间之前完成一些清理工作。
2.析构函数没有任何参数,不能被重载,所以析构函数只有一个。
3.如果用户没有自定义析构函数,c++编译系统会自动生成一个析构函数,但是它只是徒有析构函数的名称和形式,实际上什么操作都不执行。

二、析构函数和构造函数的调用顺序

一般情况下构造函数与析构函数的调用顺序相反(这是对同一类存储类别的对象而言)这是因为存储在栈上的数据有先进后出的原则,但是并 不是所以的情况都是按这一原则来处理的。在c++中有作用域和存储类别的概念,这些概念不仅对变量适用,对对象也是适用的,对象可以在不同的作用域中定义,可以有不同的存储类别,这些都会影响构造与析构的调用顺序。
下面归纳以下系统在什么时候调用构造与析构函数。
1.如果在全局范围内定义对象,那么它的构造函数实在本文件中所以函数(包括main)执行之前调用。但是,如果一个程序包含多个文件,而不同的文件中都定义了全局对象,那么这些对象的构造函数的调用顺序时不确定的。当main函数执行结束或者exit退出程序,调用析构函数。
2.如果是局部自动对象(例如在函数内部),则在建立对象时调用其构造函数,如果对象所在的函数被多次调用,则在每次调用构造函数时都要调用构造函数,在函数调用结束,对象释放时先调用析构函数。
3.如果在函数中定义局部静态对象,则程序只在第一次调用此函数定义对象时调用一次构造函数,在调用函数结束时并不释放,因此也不调用析构函数,只在main函数执行结束或者exit退出程序,才调用析构函数。
实际上上述构造与析构的调用原则,如果你对全局变量,局部变量,局部静态变量的理解到位,理解起来就会很简单,无非时由变量变成了对象而已

你可能感兴趣的:(c++,析构函数,c++)