5 规则(针对构造函数和析构函数)是否已经过时?

2024-01-27

5 规则指出,如果一个类具有用户声明的析构函数、复制构造函数、复制赋值构造函数、移动构造函数或移动赋值构造函数,则它必须具有其他 4 个。

但今天我突然意识到:什么时候需要用户定义的析构函数、复制构造函数、复制赋值构造函数、移动构造函数或移动赋值构造函数?

根据我的理解,隐式构造函数/析构函数对于聚合数据结构来说效果很好。然而,管理资源的类需要用户定义的构造函数/析构函数。

然而,是不是所有的资源管理类都可以使用智能指针转换成聚合数据结构呢?

Example:

// 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
};

vs

class ResourceManager {
    std::unique_ptr<Resource> resource;
};

现在示例 2 的行为与示例 1 完全相同,但所有隐式构造函数都起作用。

当然不能复制ResourceManager,但如果您想要不同的行为,则可以使用不同的智能指针。

要点是,当智能指针已经具有用户定义的构造函数时,您不需要用户定义的构造函数,因此隐式构造函数可以工作。

我认为拥有用户定义的构造函数的唯一原因是:

  1. 你不能在一些低级代码中使用智能指针(我非常怀疑这种情况)。

  2. 您正在实现智能指针本身。

但是,在正常代码中,我看不出有任何理由使用用户定义的构造函数。

我在这里错过了什么吗?


规则的全名是3/5/0 规则 https://en.cppreference.com/w/cpp/language/rule_of_three.

It doesn't说“始终提供全部五个”。它说你必须either提供三个、五个或都不提供。

事实上,最明智的做法往往是不提供这五项中的任何一项。但是,如果您正在编写自己的容器、智能指针或围绕某些资源的 RAII 包装器,则无法这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

5 规则(针对构造函数和析构函数)是否已经过时? 的相关文章

随机推荐

  • 在Python中处理从源目录到目标目录的一组文件

    Being 全新的在 python 中 我试图对 python 中的一组文件运行命令 该命令需要源文件和目标文件 我实际上使用的是 imagemagickconvert如下例所示 我可以提供源目录和目标目录 但是我不知道如何轻松保留从源目录
  • 为什么允许使用子类的构造函数实例化父类对象?

    考虑以下 public class parent int x parent x 5 public class child extends parent int y child super y 10 public static void ma
  • Android Rss 图片问题

    大家好 我对 Android 开发比较陌生 正在为新闻网站创建 RSS 阅读器 我遇到的问题是我想要获取图像的 rss feed 的网站的类型为 我为 android 上的代码所做的是 2 个类 RssItem 和 RssItem Disp
  • 浏览器选项卡之间的通信

    我有一个 HTML 页面 文件主要 html 使用 JavaScript 在同一域中打开一个新选项卡window open 新标签页 html method 在新选项卡中 用户可以通过单击按钮来结束其活动 此时 我想向开启者窗口发送一条消息
  • php/mysql账户激活

    我的新网站中的所有内容都工作正常 除了我无法让这段代码工作 query mysql query SELECT FROM members WHERE useremail useremail row mysql fetch assoc quer
  • 将二进制编码为音频 python 或 C

    使用C或Python 首选Python 我如何将二进制文件编码为音频 然后通过耳机插孔输出 以及如何使用麦克风插孔的输入将音频解码回二进制 到目前为止我已经学会了如何使用 python 将文本文件转换为二进制文件 这与 RTTY 通信类似
  • 在 WinCrypt 中使用 CertCreateCertificateContext 时遇到 ASN1 错误标记值

    我在这里做错了什么 创建证书上下文时 我不断收到错误 0x8009310b 满足 ASN1 错误标记值 我知道我正在测试的证书很好 我使用 DER Base 64 和 P7B 格式从中间存储中导出它 三种情况都失败 int tmain in
  • 在 UIImageView 中对 UIImage 进行向上和向下动画(就像悬停一样)循环

    您好 我有一个图像 我想上下移动 向上 10 像素和向下 10 像素 以便我的图像看起来悬停 我怎样才能用简单的动画来做到这一点非常感谢 您可以使用核心动画来对视图层的位置进行动画处理 如果您将动画配置为additive您不必费心计算新的绝
  • 如何将开发人员工具窗口恢复到正常配置?

    我有 Edge 95 0 1020 53 在 Win 10 Pro 21H1 中 我不是技术人员 没有什么具体原因 我打开了开发者工具 大约有 10 年没有打开过 打开后 我看到了我见过很多次的配置 使用整个窗口四分之三的父网页位于左侧 这
  • 在 Swashbuckle 中启用 Oauth2 客户端凭据流

    我使用 IdentityServer3 通过客户端凭据授予来保护 Web API 对于文档 我使用 Swashbuckle 但无法弄清楚如何在 SwaggerConfig 中为客户端凭据 应用程序 流程启用 Oauth2 任何帮助 将不胜感
  • Winforms/C#:在两次运行之间存储/检索(保留)文本框的内容

    有没有一种最简单的方法来简单地告诉 Winforms 主要是 TextBoxes 保留其所有内容G 到一个文件 而无需我循环遍历所有控件 我在 WPF 应用程序中看到了这一点 但我不知道 而且 Google 没有发现任何内容 是否有开箱即用
  • 检查python中目录的权限

    我想要一个给定目录的python程序 它将返回该目录中具有775的所有目录 rwxrwxr x 权限 thanks 这两个答案都不会重复 尽管尚不完全清楚这就是OP想要的 这是一种递归方法 未经测试 但您明白了 import os impo
  • 在 tkinter 中,有没有办法改变重叠画布的绘制堆栈顺序?

    问题 使用 Python 的 tkinter 我尝试通过扩展来创建自定义按钮和其他小部件画布小部件 http effbot org tkinterbook canvas htm when to use 当用户与它们交互时 如何更改在顶部绘制
  • Content-type 中的边界被 FormHttpMessageConverter 覆盖

    我在 Spring 框架中使用 FormHttpMessageConverter 为了通过restTemplate发送文件 我在项目中添加了FormHttpMessageConverter 问题是服务器获取文件询问我的加密内容类型的字符串
  • 如何在 Azure DevOps yaml 管道中的每个循环中使用变量

    我的 Azure DevOps 管道中有一个 PowerShell 脚本 task PowerShell 2 displayName Get records inputs targetType inline script lt gt rec
  • OpenID 的最佳 Coldfusion 库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 用于多图像上传的 Django Rest 框架

    我在使用 Django Rest Framework 上传多个图像时遇到了困难 我想要的是 有一个租赁表 用户可以在其中一次填写有关租赁信息以及多个图像 图像可以是厨房 客厅 浴室等 为了这笔租金 他们想登记 一份租金可以有多个图像 因此我
  • 使用 PHP 读取 JSON 数据 [重复]

    这个问题在这里已经有答案了 Solr 以以下 JSON 格式返回响应 responseHeader status 0 QTime 2 params indent on start 0 q wt json version 2 2 rows 1
  • 格式化 Netbeans 的大括号 [重复]

    这个问题在这里已经有答案了 我一直在查看 Netbeans 的选项 但找不到更改大括号默认位置的方法 public class foo to this public class foo Look in Tools gt Options gt
  • 5 规则(针对构造函数和析构函数)是否已经过时?

    5 规则指出 如果一个类具有用户声明的析构函数 复制构造函数 复制赋值构造函数 移动构造函数或移动赋值构造函数 则它必须具有其他 4 个 但今天我突然意识到 什么时候需要用户定义的析构函数 复制构造函数 复制赋值构造函数 移动构造函数或移动