C++ 类、构造函数与 RAII
类把数据和操作封装在一起。
class File {
public:
explicit File(const char* path);
~File();
private:
int fd_;
};
构造与析构
构造函数负责建立对象不变量,析构函数负责释放资源。
RAII 的核心是:资源获取即初始化。对象活着时资源有效,对象销毁时资源释放。
为什么重要
RAII 可以让异常、提前返回、复杂分支下的资源释放都变得可靠。
标准库里的 std::lock_guard、std::unique_ptr 都是 RAII 的典型例子。
RAII 更像一种纪律
RAII 的好处在简单例子里不明显,但在真实项目里非常关键。比如一个函数里打开文件、申请内存、加锁,然后中间任意一步失败。如果靠手写 close、delete、unlock,每个分支都要记得清理资源,非常容易漏。
用 RAII 后,资源释放变成对象析构的一部分:
void write_log() {
std::ofstream file{"app.log"};
std::lock_guard<std::mutex> lock{g_mutex};
file << "hello\n";
}
函数正常结束、提前返回,甚至抛异常,局部对象都会按逆序析构。
类设计的基本问题
设计一个类时,我通常会先问:
- 这个对象负责什么资源?
- 它是否可以被复制?
- 如果移动它,原对象应该处于什么状态?
- 析构时需要做什么?
这些问题比“类里放几个字段”更重要。
评论
...正在读取评论。