让我们假设我的类没有明确的复制构造函数。是否可以禁止为此类分配或复制对象的操作?例如:
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
答案 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)
如果你没有明确的复制构造函数。编译器会为你创建一个默认值。
答案 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
这是关于显式构造函数。
第二部分是避免复制和分配。所以,为此你有两个选择
根据其他人的建议,请使用boost :: noncopyable
记住“三/五/零的规则” http://en.cppreference.com/w/cpp/language/rule_of_three,让你的 复制ctor,移动ctor&amp;赋值运算符已删除。