构造函数和析构函数是C++对象生命周期管理的核心:前者在创建时初始化对象,后者在销毁前清理资源;二者共同支撑RAII原则,确保资源安全。

构造函数和析构函数是C++中管理对象生命周期的核心机制。构造函数在对象创建时自动调用,负责初始化;析构函数在对象销毁前自动调用,负责清理资源。它们不是可选的“锦上添花”,而是资源安全的关键防线。
构造函数:对象诞生时的初始化入口
构造函数名与类名完全相同,无返回类型(连void都不能写),可以重载,支持默认参数和委托构造。它的核心任务是让对象处于可用、一致的状态。
- 避免在构造函数里做耗时或可能失败的操作(比如打开文件、网络连接),否则异常会中断构造,导致对象无法存在
- 优先使用成员初始化列表(: member(value))而非在函数体内赋值,尤其对自定义类型、const成员、引用成员是必须的
- 如果类管理了动态内存、文件句柄等资源,应在构造函数中完成分配并确保初始状态明确(如指针初始化为nullptr)
析构函数:对象消亡前的善后工作
析构函数名为类名前加波浪号(~ClassName),无参数、无返回值、不能重载、不能被显式调用。它保证在对象离开作用域、被delete或临时对象结束时执行清理。
- 析构函数必须是public且非virtual——除非你打算让这个类作为基类被继承并多态删除,此时需声明为virtual
- 不要在析构函数中抛出异常(C++11起默认为noexcept),因为栈展开期间再抛异常会导致程序直接终止
- 释放资源要成对:new配delete、new[]配delete[]、fopen配fclose、malloc配free,顺序一般与构造中分配顺序相反
特殊场景下的正确配合:RAII原则
构造函数和析构函数共同支撑RAII(Resource Acquisition Is Initialization)——把资源生命周期绑定到对象生命周期。这是C++资源管理的基石。
立即学习“C++免费学习笔记(深入)”;
- 例如std::vector内部在构造时申请堆内存,在析构时自动释放;std::lock_guard在构造时加锁,析构时解锁
- 自己实现时,若类持有裸指针,应同时提供拷贝控制(拷贝构造/赋值)或禁用它们(= delete),防止浅拷贝引发双重释放
- 现代C++推荐用智能指针(std::unique_ptr、std::shared_ptr)替代裸指针,它们的构造和析构已内建RAII逻辑
常见误用与规避方式
很多问题源于忽略构造/析构的隐式行为或调用时机。
- 不写构造函数时,编译器生成默认构造函数(仅当没定义其他构造函数);但一旦写了带参构造,编译器就不再生成无参版本,可能造成派生类或容器使用失败
- 未定义析构函数时,编译器生成默认析构函数(空函数),但它不会递归释放成员指针指向的资源——这需要你手动写
- 避免在构造函数中调用虚函数:此时虚表尚未完全设置,实际调用的是当前类的版本,而非最终派生类的重写版











