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