3

我读过三法则,三法则是什么?总结如下:

如果您需要自己显式声明析构函数、复制构造函数或复制赋值运算符,您可能需要显式声明所有这三个。

我的问题是:在 C++ 应用程序中,我有一个管理资源的类(有一个处理删除指针的析构函数)。我知道应用程序到处都使用赋值运算符,但我绝对确定在应用程序中没有使用复制构造函数,即类型的使用,Class c(..); Class d(c);所以在这种情况下,我仍然需要同时实现赋值运算符和复制构造函数?还是仅一个赋值运算符就足够了?赋值运算符是否有可能以某种方式使用复制构造函数?

欣赏你的想法。

4

3 回答 3

13

如果您知道不会使用复制构造函数,则可以通过将其设为私有且未实现来表达这一点,因此:

class C
{
private:
    C(const C&); // not implemented
};

(在 C++11 中,您可以使用新= delete语法)。也就是说,只有在您绝对确定永远不需要它的情况下,您才应该这样做。否则,您最好实施它。重要的是不要让它保持原样,因为在这种情况下,编译器将提供一个默认的成员复制构造函数,它会做错事——这是一个等待发生的问题。

在某种程度上,这取决于该类将用于什么 - 例如,如果您正在编写一个作为库一部分的类,那么出于一致性原因实现复制构造函数会更有意义。您事先不知道您的课程将如何使用。

于 2012-06-13T22:50:27.113 回答
4

我绝对确定在复制构造函数的应用程序中没有使用,即使用类型 Class c(..); d(c) 类

你知道下面的代码

Foo c;
Foo b = c;

调用复制构造函数而不是赋值运算符?为了安全起见,我会实现复制构造函数。

于 2012-06-13T22:50:13.223 回答
1

在几乎所有情况下,编译器都会为您生成这些方法,而您无需执行任何操作。但是,如果隐式生成的复制构造函数/赋值运算符不能满足您的要求,并且在设计方面您的类能够被复制是有意义的,那么无论您是否同时使用它们,您都应该显式提供一个复制 ctor 和赋值运算符(作为良好做法)。

如果在设计方面,您的类是不可复制的,您可以声明但不定义复制 ctor/assignment 操作。

于 2012-06-13T22:52:11.610 回答