我读过“三法则”What is The Rule of Three?总结如下:
如果需要显式声明析构函数,复制构造函数或复制赋值 操作员自己,你可能需要明确声明所有这三个。
我的问题是:在C ++应用程序中,我有一个管理资源的类(有一个处理删除指针的析构函数)。我知道应用程序在整个地方使用赋值运算符,但我绝对肯定在复制构造函数的应用程序中没有用法,即使用类型Class c(..); Class d(c);
所以在这种情况下,我还是需要实现赋值运算符和复制构造函数?或者一个赋值算子是否足够?赋值运算符是否可能以某种方式使用复制构造函数?
欣赏你的想法。
答案 0 :(得分:13)
如果您知道不会使用复制构造函数,您可以通过将其设为私有和未实现来表达,因此:
class C
{
private:
C(const C&); // not implemented
};
(在C ++ 11中,您可以使用新的= delete
语法)。也就是说,如果你绝对确定永远不需要,你应该这样做。否则,您可能最好实现它。重要的是不要保持原样,因为在这种情况下,编译器将提供一个默认的成员复制构造函数,它将执行错误的操作 - 这是一个等待发生的问题。
在某种程度上,它取决于将要使用的类 - 例如,如果您正在编写属于库的类,则出于一致性原因,实现复制构造函数会更有意义。你不知道你的课程将如何被使用。
答案 1 :(得分:4)
我绝对肯定在复制构造函数的应用程序中没有用处,即使用类型C(..); D(c)类
您是否知道以下代码
Foo c;
Foo b = c;
调用复制构造函数而不是赋值运算符?为了安全起见,我实现了复制构造函数。
答案 2 :(得分:1)
在几乎所有情况下,编译器都会为您生成这些方法,您无需执行任何操作。但是,如果隐式生成的复制构造函数/赋值运算符不能执行您想要的操作,并且在设计方面您的类有意义可以复制,那么应显式提供复制ctor和赋值运算符是否使用它们(作为良好做法)。
如果在设计方面,你的类是不可复制的,你可以声明但不能定义复制ctor / assignment op。