跳转至

C++ 模式

此文件使用 C++ 特定内容扩展 common/patterns.md。

RAII(资源获取即初始化)

将资源生命周期绑定到对象生命周期:

class FileHandle {
public:
    explicit FileHandle(const std::string& path) : file_(std::fopen(path.c_str(), "r")) {}
    ~FileHandle() { if (file_) std::fclose(file_); }
    FileHandle(const FileHandle&) = delete;
    FileHandle& operator=(const FileHandle&) = delete;
private:
    std::FILE* file_;
};

五法则/零法则

  • 零法则:优先选择无需自定义析构函数、拷贝/移动构造函数或赋值运算符的类
  • 五法则:如果定义了析构函数/拷贝构造函数/拷贝赋值/移动构造函数/移动赋值中的任意一个,则应定义全部五个

值语义

  • 小型/平凡类型按值传递
  • 大型类型以 const& 传递
  • 按值返回(依赖 RVO/NRVO)
  • 对接收所有权的参数使用移动语义

错误处理

  • 对异常情况使用异常
  • 对可能不存在的值使用 std::optional
  • 对预期失败使用 std::expected(C++23)或结果类型

参考

关于全面的 C++ 模式和反模式,请参见技能:cpp-coding-standards。

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 ev/ECC