C ++中的三条规则

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

如果您需要自己显式声明析构函数,复制构造函数或复制赋值运算符,则可能需要明确声明它们中的全部三个。

我的问题是:在C ++应用程序中,我有一个管理资源的类(具有处理删除指针的析构函数)。 我知道应用程序在整个地方都使用了赋值运算符,但我绝对确信在复制构造函数的应用程序中没有用法,即使用Class c(..); Class d(c);类型Class c(..); Class d(c); Class c(..); Class d(c); 所以在这种情况下,我是否仍然需要实现赋值操作符和拷贝构造函数? 或者只有一个任务操作员就足够了? 赋值操作符有可能以某种方式使用拷贝构造函数吗?

欣赏你的想法。


如果您知道复制构造函数将不会被使用,您可以通过将其设置为私有和未实现来表示,因此:

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

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

在某种程度上,它取决于类将用于什么 - 例如,如果您正在编写一个属于库的一部分的类,则出于一致性原因实现复制构造函数会更有意义。 你不知道你的班级将如何使用。


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

你知道下面的代码

Foo c;
Foo b = c;

调用复制构造函数而不是赋值运算符? 我会实现复制构造函数以保证安全。


在几乎所有情况下,编译器都会为您生成这些方法,您不需要执行任何操作。 但是,如果隐式生成的拷贝构造函数/赋值操作符不会做你想要的,并且在设计方面你的类可以被复制,你应该明确地提供一个拷贝ctor和赋值操作符,不管你是否使用它们(如良好的做法)。

如果从设计角度来看,你的课堂是不可复制的,你可以声明但不定义复制课程/课外作业。

链接地址: http://www.djcxy.com/p/73161.html

上一篇: Rule of Three in C++

下一篇: How to actually implement the rule of five?