复制构造函数,析构函数和赋值运算符。什么时候不需要它们?

时间:2011-03-31 09:47:02

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

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

有什么情况下你不需要提供所有三个,只有一个或两个?

为什么C ++不要求你将它们中的一个添加到你的类中?

EDIT1:

你提到的例子当你不仅不需要其中的一些,而且你不想拥有它们,所以你想让它们成为私有或受保护的。但即使是空体,你仍然需要在代码中编写它们。

当你通过添加一个带有空体的虚拟析构函数来制作类polimorphic时,我没有全部使用它们的唯一正当理由。但是只要你在析构函数体内写一些东西,就应该考虑在cctor的主体中写一些东西,并且op =。

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

如果你的类中有指针或类似指针,你必须全部写出来,因此复制主题或op =中没有浅拷贝,而且dtor中没有内存泄漏。

这是一个你应该全部写的案例,其他案例中存在其他案例。

C ++并不需要它们,因为它会写入默认值,因为它们可能不是必须的。

答案 3 :(得分:1)

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

最后,编译器生成的版本是内联的,您可能需要 声明其中一个函数以防止它内联。 (在 记忆力较小的日子,这通常是一个考虑因素。)

相关问题