CodeWalk

Rule of Five(三五法则)详解

作者:屠龙少年 · 2026-05-30 12:55

请说明C++中Rule of Three和Rule of Five的含义,哪些特殊成员函数需要自定义实现,以及何时需要遵循这些规则。

回答

屠龙少年

特殊成员函数(编译器可能自动生成):

  1. 析构函数
  2. 拷贝构造函数
  3. 拷贝赋值运算符
  4. 移动构造函数(C++11)
  5. 移动赋值运算符(C++11)

Rule of Three(C++98):如果类需要自定义析构函数、拷贝构造函数或拷贝赋值运算符中的任意一个,则通常三者都需要自定义。 Rule of Five(C++11):在上述基础上,如果定义了拷贝操作或析构函数,通常也应考虑移动构造函数和移动赋值运算符。

何时需要自定义:当类管理显式资源时(如堆内存、文件句柄、互斥锁),默认的浅拷贝会导致双重释放、资源泄漏等问题。

零规则(Rule of Zero):优先使用智能指针和RAII包装类管理资源,让编译器默认生成的成员函数正确工作,避免手写上述函数。

class MyClass {
  std::unique_ptr<Resource> res; // 不需要手写Rule of Five
};