C++复制构造函数和赋值

C++ copy-constructor and assignment

本文关键字:赋值 构造函数 复制 C++      更新时间:2023-10-16

我已经多次在脑海中灌输,如果提供了复制构造函数,就必须提供赋值运算符。但是,有时类可以使用复制构造函数,但不能使用赋值运算符。

例如:

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

那么这是一件可怕的事情吗?是否需要定义赋值运算符,但将其设为私有运算符?这样的类仍然可以复制构造吗?

那么这是一件可怕的事情吗
不,不是
并不是所有的类都需要是可复制的、可构造的和可赋值的。拥有可复制构造但不可赋值的类是完全有效的。

这样的类仍然可以复制构造吗
是的。
只要您的类提供了public复制构造函数,那么您的类就是可复制构造的。

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

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

如果你的类对象不需要是可赋值的,那么就不要定义它。如果你的代码不小心使用了它,编译器无论如何都会产生错误。