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

How to prevent object=constructor(); assignment in c++

本文关键字:c++ 赋值 何防止 object constructor      更新时间:2023-10-16

这就是我要做的:

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的情况下做到这一点,那就太好了。

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

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

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

例如:

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;
}

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

您只需= delete;复制分配运算符:

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

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

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

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 & );
};