【问题标题】:Copy constructor, destructor and assignment operator. When don't we need them all?复制构造函数、析构函数和赋值运算符。我们什么时候不需要它们?
【发布时间】:2011-07-26 18:13:19
【问题描述】:

当您将 cctor、dtor 或 op= 添加到您的类时,我知道 C++ 经验法则,您还需要添加其他两个以使您的类在所有情况下都能正常工作。

是否有任何情况下您不需要提供所有三个,只需提供其中一两个?

如果您将其中一个添加到您的类中,为什么 C++ 不要求您将它们全部添加?

编辑1:

当您不仅不需要其中一些示例,而且您不想拥有它们,因此您希望将它们设为私有或受保护时,您提到了示例。但是即使是空的主体,你仍然需要在代码中编写它们。

当您通过添加具有空主体的虚拟析构函数来使类多态时,我没有全部拥有它们的唯一正当理由。但是一旦你在析构函数的主体中写了一些东西,你应该考虑在 cctor 和 op= 的主体中写一些东西。

我正在寻找不需要编写所有 3 种方法的示例,并且即使新手正在使用您的课程,您也可以省略其中一些方法而不会在您的课程中造成错误。 :)

【问题讨论】:

    标签: c++ destructor copy-constructor standards assignment-operator


    【解决方案1】:

    在开发多态类时,您可能希望使用没有复制构造函数或赋值运算符的析构函数,在这种情况下,您希望virtual 析构函数允许通过基类指针解除分配。这些类通常会支持复制构造函数,以方便“虚拟克隆”习语。然而,它们很少有赋值运算符,因为多态类通常是堆分配的,并且只能通过指针引用,在这种情况下,直接赋值几乎总是会导致切片。

    【讨论】:

    • 我要补充一点,为了防止切片,你最好让复制构造函数受到保护。
    • 对于多态类,您可能也希望将 op= 设为私有或受保护。
    【解决方案2】:

    被观察的类(那些将它们的生命周期报告给另一个类的)需要所有的构造函数和析构函数,但不是 op=。 C++ 不需要它们,因为这完全没有必要——我们程序员最了解。

    此外,如果你有一个不可复制的类,你可能需要析构函数而不是其他两个。

    【讨论】:

    • 如果你真的想让一个类型不可复制,你可能仍然想把 cctor 和 op= 写成 private 或 protected。
    【解决方案3】:

    如果你的类中有指针或类似的东西,你必须把它们全部写出来,这样在拷贝 cctor 或 op= 中不会有浅拷贝,在 dtor 中也不会出现内存泄漏。

    这是一种情况,你应该把它们都写出来,其他情况存在于其他答案中。

    C++ 不需要它们,因为它会编写默认值,而且它们可能不是必需的。

    【讨论】:

    • 问题是证明不需要它们的情况。
    【解决方案4】:

    一般来说,当您想要更改访问权限时,或者在 析构函数,使其成为虚拟的。声明一个私有拷贝构造函数 或赋值运算符是禁止这些操作的经典方式, 即使您不需要析构函数;任何时候你想从中获得 一个类,析构函数应该是虚拟的(或受保护的);如果你 想要禁止除了动态分配的实例之外的任何东西,经典 成语是将析构函数声明为私有,并实现一个destruct 执行delete this 以摆脱对象的函数。

    最后,编译器生成的版本是内联的,你可能想要 声明这些函数之一以防止它被内联。 (在 内存较小的日子,这通常是一个考虑因素。)

    【讨论】:

      猜你喜欢
      • 2014-04-24
      • 2017-06-24
      • 2015-01-04
      • 2011-07-19
      • 1970-01-01
      • 1970-01-01
      • 2011-09-27
      • 1970-01-01
      相关资源
      最近更新 更多