C++中的三规则

squ*_*boo 3 c++ rule-of-three

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

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

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

欣赏你的想法.

Stu*_*etz 13

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

class C
{
private:
    C(const C&); // not implemented
};
Run Code Online (Sandbox Code Playgroud)

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

在某种程度上,它取决于将要使用的类 - 例如,如果您正在编写属于库的类,则出于一致性原因,实现复制构造函数更有意义.你不知道你的课程将如何被使用.

  • 是的,它也适用于结构.除了默认的公共访问和公共继承之外,结构就像一个类.也就是说,如果您正在管理资源,那么使用`class`关键字可能会更加惯用 - 管理结构中的资源会有些奇怪.结构是C的宿醉,尽管C++中的结构和类之间几乎没有区别,但更常见的是继续主要以类似C的方式使用它们. (2认同)