C ++拷贝构造函数和赋值

时间:2012-01-17 18:48:19

标签: c++ copy-constructor assignment-operator

我已经多次钻进脑袋,如果提供了复制构造函数,还必须提供赋值运算符。但是,有时类可以使用复制构造函数而不是赋值运算符。

例如:

class A {
public:
  const int myVar;

  A(const int var) : myVar(var) {};
  A(const A& other) : myVar(other.myVar) {};
};

这是一件可怕的事吗?赋值运算符是否需要定义但是是私有的?这样的类仍然是可复制的吗?

1 个答案:

答案 0 :(得分:3)

这是一件可怕的事吗?
不,不是。
并非所有类都需要可复制构造和可分配。具有可复制构造但不可分配的类是完全有效的。

此类仍然可以复制构建吗?
是的。
只要您的类提供public拷贝构造函数,您的类就是可复制构造的。

是否需要定义赋值运算符但是将其设为私有?
这取决于您的使用情况 如果您的类需要可分配,那么理想情况下它应该没有const成员。

如果您的类具有const成员,则默认编译器生成的复制赋值运算符将不起作用,因为它尝试分配给不允许的const成员。因此,如果您的代码需要复制赋值运算符,则必须提供自己的重载版本。但是,无论如何,这个重载版本无法提供预期的赋值语义。

如果您的类对象不需要是可分配的,则不要定义它。如果您的代码意外使用它,编译器将始终生成错误。