gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:01:48 28 4
gpt4 key购买 nike

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/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com