提问人:squashed.bugaboo 提问时间:6/14/2012 最后编辑:Communitysquashed.bugaboo 更新时间:6/14/2012 访问量:1899
C++ 中的三法则
Rule of Three in C++
问:
我读过《三法则,什么是三法则?》总结如下:
如果需要显式声明析构函数、复制构造函数或复制赋值 运算符,您可能需要显式声明所有三个。
我的问题是:在 C++ 应用程序中,我有一个管理资源的类(有一个处理删除指针的析构函数)。我知道应用程序到处都使用赋值运算符,但我绝对确定在复制构造函数的应用程序中没有用法,即类型的用法,因此在这种情况下,我是否仍然需要同时实现赋值运算符和复制构造函数?还是仅凭赋值运算符就足够了?赋值运算符是否有可能以某种方式使用复制构造函数?Class c(..); Class d(c);
欣赏你的想法。
答:
我绝对确定在复制构造函数的应用中没有用法,即使用类型 c(..);d(c)类
您是否知道以下代码
Foo c;
Foo b = c;
调用复制构造函数而不是赋值运算符?为了安全起见,我会实现复制构造函数。
评论
如果您知道不会使用复制构造函数,则可以通过将其私有化和未实现来表达它,因此:
class C
{
private:
C(const C&); // not implemented
};
(在 C++11 中,您可以使用新语法)。也就是说,只有在您绝对确定永远不需要它时,您才应该这样做。否则,你最好实现它。重要的是不要只是保持原样,因为在这种情况下,编译器将提供一个默认的成员复制构造函数,该构造函数将做错误的事情 - 这是一个等待发生的问题。= delete
在某种程度上,这取决于类的用途 - 例如,如果你正在编写一个属于库的类,那么出于一致性原因实现复制构造函数更有意义。你不知道你的类将如何被使用。
评论
class
在几乎所有情况下,编译器都会为你生成这些方法,你不需要做任何事情。但是,如果隐式生成的复制构造函数/赋值运算符不能执行您想要的操作,并且从设计上讲,您的类能够被复制是有意义的,那么无论您是否同时使用它们,您都应该显式提供复制 ctor 和赋值运算符(作为良好做法)。
如果从设计上讲,你的类是不可复制的,你可以声明但不能定义 copy ctor/assignment op。
评论
上一个:分割故障;三法则
评论