如果没有明确的复制构造函数,是否可以禁止赋值? C ++

时间:2015-10-01 08:29:13

标签: c++ copy-constructor assignment-operator

让我们假设我的类没有明确的复制构造函数。是否可以禁止为此类分配或复制对象的操作?例如:

class A
{
   // data, methods, but no copy constructor and no overloaded assignment operator
};

A object1;
A object2;

object1 = object2; // make compiler error here

A object3 = object1; // or here

7 个答案:

答案 0 :(得分:9)

您可以将复制构造函数和复制赋值运算符标记为已删除:

class A
{
public:
    ...

    A(const A&) = delete;
    A& operator=(const A&) = delete;
};

如果您的编译器不支持这样的C ++ 11功能,只需创建函数private

答案 1 :(得分:2)

试试这个

private:

        A(A const&); //Don't implement it
        A& operator=(A const&);//Don't implement it

或使用C ++ 11

        A(A const&)             = delete;
        A& operator=(A const&)  = delete;

答案 2 :(得分:1)

  

假设我的课没有明确的复制构造函数。是否可以禁止为此类分配或复制对象的操作?

boost::noncopyable派生,一个不可复制的基类,或者添加一个不可复制的非静态数据成员。

答案 3 :(得分:1)

如果你没有明确的复制构造函数。编译器会为你创建一个默认值。

  • 禁止复制使复制构造函数成为私有。
  • 禁止分配make assignment operator private

答案 4 :(得分:0)

我也可以在没有定义的情况下声明复制构造函数或赋值运算符。当我调用其中任何一个时,我都会收到链接器错误。

答案 5 :(得分:0)

只有在编译器可以生成隐式复制构造函数和赋值运算符时,才能调用它。它们(从概念上讲,至少)复制基类,然后执行所有成员的成员副本。如果无法执行其中任何一个操作,则不会生成隐式复制构造函数或赋值运算符。

因此,您可以通过从不可复制的基类派生或通过包含不可复制类型的(非静态)成员来禁止这些操作。

作为编码原则,我认为将操作显式声明为已删除(或私有,前C ++ 11)成员更明确,而不是依赖于不可复制成员或基类的存在。如果成员/基地被命名为传达该意图(例如boost::noncopyable),我将作出例外。

答案 6 :(得分:0)

您的问题有两部分:

首先是显式构造函数,显式构造函数的目的是避免隐式构造。通过隐式构造我的意思是

struct C {
    int a;
    C(int p):a(p) {}
    ~C(){std::cout<<"Destructor for "<<a<<'\n';}
};
int main() {
  C c1 = 142; // implicit-initialization, calls C::C(42)
  C c2{12}; // 

  return 0;
}

但是如果我们将构造函数显式为

explicit C(int a);

然后下面的代码将无法编译。

C c1 = 142; // would not compile

这是关于显式构造函数。

第二部分是避免复制和分配。所以,为此你有两个选择

  1. 根据其他人的建议,请使用boost :: noncopyable

  2. 记住“三/五/零的规则”     http://en.cppreference.com/w/cpp/language/rule_of_three,让你的     复制ctor,移动ctor&amp;赋值运算符已删除。