析构函数
析构函数是一个特殊的成员函数,其作用与构造函数相反,它的名字是类的名字前面加一个“~”符号,在c++中这是位取反运算符,理解为析构函数是与构造函数作用相反的函数
以下四种情况程序会自动执行析构函数:
- 如果在一个函数中定义了对象(假设是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数
- 静态局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只有在main函数结束或者调用exit函数结束程序时才调用static局部对象的析构函数
- 如果定义了一个全局的对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数结束),调用该全局的对象的析构函数
- 如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数
析构函数的作用并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作
- 一个类可以有多个构造函数,但是只能有一个析构函数
- 先构造的后析构,后构造的先析构,相当于一个栈,先进后出
注:
析构函数不能被重载
在以下情况系统调用构造函数和析构函数:
1. 如果在全局范围中定义变量,则其构造函数在本文件模块中的所有函数执行之前调用。但若是一个程序包含多个文件,且在不同的文件中都定义了全局对象,则这些对象的构造函数的执行顺序不确定。当main函数执行完毕或调用exit函数时调用析构函数
2. 若定义的时局部自动变量(假设在函数中定义对象),则在建立对象时调用其构造函数。如果对象所在的函数被多次调用,则在每次建立对象时都要调用构造函数。在函数调用结束、对象释放时先调用析构函数。
3.如果在函数中定义静态局部变量,则只在程序第1次调用此函数定义对象时调用构造函数一次,在调用函数结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时才调用析构函数