与构造函数相对应,构造函数是对象创建的时候自动调用的,而析构函数就是对象在销毁的时候自动调用的。与构造函数作用刚好相反,构造函数是用来初始化成员变量,析构函数是用来释放对象占用的资源。
A(const int data) { cout << "A的构造函数" << endl; m_data = new int(data); *m_data = data; } ~ A() { cout << "A的析构函数" << endl; delete m_data; m_data = NULL; } private: int *m_data;
-
函数名必须是"~类名",没有返回类型,也没有参数,也无法重载
-
当对象销毁时,该类的析构函数会自动的被执行(不建议手动调用析构)
-
- 栈对象:当离开作用域时,其析构函数被自动调用
-
- 堆对象:堆对象的析构函数被delete操作符调用
int main() { //A a;//堆对象 A* a = new A(); cout << "delete之前" << std::endl; delete a;//堆区申请内容编译器不会帮我们释放,堆区对象也不会调用其析构函数,需要手动调用, delete操作符会调用析构函数 cout << "delete之后" << std::endl; return 0; }
- 堆对象:堆对象的析构函数被delete操作符调用
-
如果一个类没有显式定义析构函数,那么系统会为该类提供一个缺省的析构函数:
-
- 对于基本类型的成员变量,什么也不做
-
- 对于类类型的成员变量,调用相应类的析构
对象创建和销毁的过程
1)创建
-->分配内存
-->构造成员子对象(按声明顺序)
-->执行构造函数代码
2)销毁
-->执行析构函数代码
--* >析构成员子对象(按声明逆序)
-->释放内存
- 对于类类型的成员变量,调用相应类的析构