🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一.析构函数 ### 1.作用 + 对象生存期结束时由系统自动调用,完成对象被清除前的一些清理工作。 ### 2.调用时机 + 对象到达作用域末尾 + `delete` 对象 ### 3.特点 + **无名函数** 它只是被编译器调用,而不是被程序员调用。 + **无返回值** + **没有参数** 也不允许默认参数。 ### 4.定义和声明 + **定义** `~类名() {}` + **声明** `~类名();` ### 5.默认的析构函数 如果类中没有构造函数,则编译器可以自动创建一个空的公有析构函数。 >当类满足下列条件时,编译器 **不会** 自动创建析构函数: > >+ 有用户定义的析构函数 >当类满足下列条件时,编译器将析构函数定义为弃置的 `delete`(在C++11之前,这些情况下编译器不会自动创建析构函数): > >+ 非静态类类型数据成员或基类没有析构函数,或析构函数不能访问(例如将析构函数设置为私有)。 ```c++ //让Pointer类接管一个动态分配的单个空间 //这样就不需要程序员手动执行 delete 操作 class Pointer { private: int* ptr; public: Pointer() {} Pointer(int* heap) { ptr = heap; } //析构函数,释放空间 ~Pointer() { delete ptr; } }; ``` ## 二.析构函数和构造函数的执行次序 栈式管理,严格相反。后创建的先析构。 ```c++ #include <iostream> using namespace std; class Man{ public: Man() { cout<<"初始化Man对象"<<endl; } ~Man() { cout<<"删除Man对象"<<endl; } }; class Woman{ public: Woman() { cout<<"初始化Woman对象"<<endl; } ~Woman() { cout<<"删除Woman对象"<<endl; } }; class Pair{ private: Man husband; Woman wife; public: Pair() { cout<<"初始化Pair对象"<<endl; } ~Pair() { cout<<"删除Pair对象"<<endl; } }; int main() { Pair p; cout<<"p已初始化完毕"<<endl; return 0; } ``` >[test] > 初始化Man对象 > 初始化Woman对象 > 初始化Pair对象 > p已初始化完毕 > 删除Pair对象 > 删除Woman对象 > 删除Man对象