如何防止object = constructor();在c ++中赋值

时间:2015-12-21 20:47:08

标签: c++

这就是我想要做的事情:

class A{
    public:
    A(){/*need to initialize something here*/}
};

int main(){
    A a;      //OK
    a=A();    //not OK
    a=A(b);  //not OK
    ///Only A a; needs to be allowed.
    return 0;
}

我需要在使用复制构造函数阻止对象初始化的同时初始化某些内容,并且还要阻止分配给现有对象。

注意:如果我可以在没有>=C++11的情况下执行此操作会很好。

4 个答案:

答案 0 :(得分:8)

从C ++ 11开始,只需删除赋值运算符:

class A{
    public:
    A(){/*need to initialize something here*/}
    A& operator =(const A&) = delete;
};

答案 1 :(得分:4)

您可以通过在私有部分中声明赋值运算符和复制构造函数来实现目标,而不是定义它们。

例如:

class A {
private:
    A(A&); // declared, not defined

    void operator= (A&); // declared, not defined

public:
    A() { //do regular stuff }
}

但是,如果您使用的是C ++ 11 / C ++ 14,则可以使用delete关键字来更明确地说明这一点:

class A {
public:
    A() { //do regular stuff }
    A(A&) = delete;

    void operator= (A&) = delete;
}

由于如果声明任何析构函数/复制构造函数/赋值运算符,则不会生成移动构造函数和移动赋值运算符,因此对它们不需要相同的操作。

答案 2 :(得分:3)

您只需= delete;复制赋值运算符:

class A {
    // ...
    void operator=(A) = delete;
};

或者,如果您不使用C ++ 11,则可以将副本分配设为私有。

答案 3 :(得分:1)

您可以将赋值运算符定义为已删除。例如

class A{
    public:
    A(){/*need to initialize something here*/}
    A & operator =( const A & ) = delete;
};

或者您可以声明private

class A{
    public:
    A(){/*need to initialize something here*/}
    private:
    A & operator =( const A & );
};