析构函数的基本概念
什么是析构函数
析构函数(destructor)是一种特殊的成员函数,与构造函数功能相反。当对象结束其生命周期时(如对象所在的函数已调用完毕),系统会自动执行析构函数。析构函数主要完成'清理善后'工作,例如释放对象在生命周期中申请的资源。
析构函数的声明与定义
在 C++ 中,析构函数的声明和定义遵循特定语法规则:
class ClassName {
public:
~ClassName(); // 析构函数声明
};
ClassName::~ClassName() {
// 析构函数定义(函数体)
}
析构函数的名称为类名前加波浪符(~),没有返回值类型,也不接受任何参数。
析构函数的特性与工作原理
核心特性
析构函数具有以下关键特性:
- 与类名相同:在名称前加波浪符(~)以区别于构造函数
- 无参数无返回值:不能带任何参数,也没有返回值(包括 void 类型)
- 不可重载:每个类只能有一个析构函数
- 自动调用:由系统在对象销毁时自动执行,不能手动调用
默认析构函数
如果用户没有显式定义析构函数,编译系统会自动生成一个缺省的析构函数。这个默认析构函数不执行任何操作,仅提供基本的对象销毁机制。
值得注意的是,即使自定义了析构函数,编译器也总是会为我们合成一个析构函数。如果自定义了析构函数,编译器在执行时会先调用自定义的析构函数,再调用合成的析构函数。
析构函数的调用时机
析构函数在以下情况下会被自动调用:
- 局部对象:当函数执行结束,局部对象离开其作用域时
- 全局对象:程序结束时,全局对象和静态对象的析构函数被调用
- 动态分配的对象:使用
delete运算符释放对象时 - 临时对象:临时对象完成其使命后
析构函数的实际应用
资源管理
析构函数最常见的用途是释放对象在生命周期中申请的资源,如动态内存、文件句柄、网络连接等。
示例:
#include <iostream>
#include <cstring>
class Student {
public:
// 默认构造函数
Student(const char* name, int age) {
->name = [(name) + ];
(->name, name);
->age = age;
}
~() {
std::cout << << name << std::endl;
[] name;
}
{
std::cout << << name << << age << std::endl;
}
:
* name;
age;
};
{
{
;
student();
}
{
;
student();
}
;
}

