首页 文章

C中的三法则

提问于
浏览
3

我读过“三法则”,What is The Rule of Three?总结如下:

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

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

欣赏你的想法 .

3 回答

  • 1

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

    您是否知道以下代码?

    Foo c;
    Foo b = c;
    

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

  • 13

    在几乎所有情况下,编译器都会为您生成这些方法,并且您没有按照自己的意愿行事,并且在设计方面您的类能够被复制,您应该明确地提供复制ctor和赋值运算符,无论您是否是否使用它们(作为良好做法) .

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

  • 4

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

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

    (在C 11中,您可以使用新的 = delete 语法) . 也就是说,你应该这样做,如果你重要的是不要保持原样,因为在这种情况下,编译器将提供一个默认的成员复制构造函数,它会做错误的事情 - 这是一个等待发生的问题 .

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

相关问题