Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止object=constructor();C++中的赋值_C++ - Fatal编程技术网

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

如何防止object=constructor();C++中的赋值,c++,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; } 我需要初始化一些东西,同时防止使用复制构造函数初始化对象,并防止分配给现有对

这就是我想做的:

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 {
    // ...
    void operator=(A) = delete;
};
你可以直接=删除;复制分配运算符:

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

或者,如果不使用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;
}

由于如果您声明任何析构函数/复制构造函数/赋值运算符,将不会生成移动构造函数和移动赋值运算符,因此不需要为它们指定相同的内容。

A如何;A b;a=b@伊米比斯:这也需要预防。只有A;alloweda=AB&;这不是一件事。@Jahid:这是一件非常重要的事,你不应该把它排除在你的问题之外。你肯定应该把它编辑到你的问题中。@Jahid-那是初始化。这不是作业,尽管里面有一个=。它使用复制构造函数,而不是赋值运算符。是否有理由使用奇怪的签名void运算符=A?@Jarod42可能是因为它较短?它与常量A&没有区别,因为运算符=anyway将被删除。@vladon:但A&比void短,并且参数A可以被删除。。。所以这个原因,即使可能,也有一些矛盾…@Jarod42哦,没有提到void。真奇怪:-@Jarod42:是的,这个参数应该被省略了,我会从答案中删除它。返回类型void往往比实际类的名称短,而实际类的名称通常比一个字符长得多。值参数的使用主要是为了明确赋值运算符不需要像复制构造函数那样引用其参数。