5

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

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

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

编辑1:

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

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

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

4

4 回答 4

5

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

于 2011-03-31T09:50:45.690 回答
3

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

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

于 2011-03-31T09:49:41.170 回答
1

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

这是您应该将它们全部写出来的一种情况,其他情况存在于其他答案中。

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

于 2011-03-31T09:53:05.420 回答
1

通常,当您要更改访问权限时,或者在析构函数的情况下,将其设为虚拟。声明私有复制构造函数或赋值运算符是禁止这些操作的经典方式,即使您不需要析构函数;任何时候你想从一个类派生,析构函数应该是虚拟的(或受保护的);如果你想禁止除了动态分配的实例之外的任何东西,经典的习惯用法是将析构函数声明为私有,并实现一个 destruct 函数delete this来摆脱对象。

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

于 2011-03-31T09:56:53.110 回答