如何防止object=constructor();c++中的赋值
How to prevent object=constructor(); assignment in 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
的情况下做到这一点,那就太好了。
从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 & );
};
相关文章:
- 为"adjacent"变量赋值时出现问题
- C++中的赋值发生,尽管右侧出现异常
- 用C++中的sscanf赋值
- 为std::string的某个索引赋值
- 重载Singly Linked List中的赋值运算符
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- gtest_使用setargpointee在函数中赋值
- 非常量变量只读位置的赋值
- 使用赋值运算符重载从类中返回jobject
- C++数据文件、数组和计算赋值
- 为什么在使用转换构造函数赋值后调用C++类的析构函数?
- 全局作用域中函数指针的赋值
- 错误:在为指针赋值时,void值没有被忽略
- 标准库类型的赋值运算符的引用限定符
- 关于 c++ 函数中指针赋值的简单问题
- 复制构造函数、赋值运算符C++
- 标准::变体的赋值运算符
- cin >> int 给定一个字符串将 int 赋值为 0
- if 子句中的赋值不起作用
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?