c++ - 5 法则(对于构造函数和析构函数)是否过时了?

标签 c++ smart-pointers raii resource-management

5 规则指出,如果一个类有一个用户声明的析构函数、复制构造函数、复制赋值构造函数、移动构造函数或移动赋值构造函数,那么它必须有其他 4 个。
但今天我突然明白了:你什么时候需要用户定义的析构函数、复制构造函数、复制赋值构造函数、移动构造函数或移动赋值构造函数?
在我的理解中,隐式构造函数/析构函数适用于聚合数据结构。但是,管理资源的类需要用户定义的构造函数/析构函数。
但是,不能将所有资源管理类都使用智能指针转换为聚合数据结构吗?
例子:

// RAII Class which allocates memory on the heap.
class ResourceManager {
    Resource* resource;
    ResourceManager() {resource = new Resource;}
    // In this class you need all the destructors/ copy ctor/ move ctor etc...
    // I haven't written them as they are trivial to implement
};
对比
class ResourceManager {
    std::unique_ptr<Resource> resource;
};
现在示例 2 的行为与示例 1 完全相同,但所有隐式构造函数都可以工作。
当然不能复制ResourceManager ,但如果您想要不同的行为,您可以使用不同的智能指针。
关键是当智能指针已经有那些隐式构造函数可以工作时,你不需要用户定义的构造函数。
我认为拥有用户定义的构造函数的唯一原因是:
  • 你不能在一些低级代码中使用智能指针(我非常怀疑这种情况)。
  • 您正在自己实现智能指针。

  • 但是,在普通代码中,我看不出有任何理由使用用户定义的构造函数。
    我在这里错过了什么吗?

    最佳答案

    规则的全称是the rule of 3/5/0 .
    没有 说“总是提供所有五个”。它说你必须要么 提供三个、五个或一个都不提供。
    事实上,最明智的做法往往是不提供这五个中的任何一个。但是,如果您正在编写自己的容器、智能指针或围绕某些资源的 RAII 包装器,则不能这样做。

    关于c++ - 5 法则(对于构造函数和析构函数)是否过时了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65455464/

    相关文章:

    c++ - 在我的 C++ 程序中构建错误

    c++ - 安全地传递指针所有权异常

    c++ - 如何检查std::unique_ptr是否为空(如果它位于std::vector中)?

    c# - 是否有比嵌套 "using"更好的确定性处置模式?

    c++ - 返回指向结构的指针,如何自动释放内存?

    c++ - C++中RAII和智能指针的区别

    c++ - 内存中相邻声明的两个公共(public)字段必须为 "next to each other"吗?

    c++ - C++ 中的可变仿函数可以支持命名字段吗?

    c++ - range-for循环中的访问索引

    c++ - 将 shared_ptr<Derived> 作为 shared_ptr<Base> 传递