定义复制构造函数时是否总是必须定义复制赋值运算符?

问题描述 投票:0回答:1

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

例如:

class A {
public:
  const int myVar;

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

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

c++ copy-constructor assignment-operator rule-of-three
1个回答
4
投票

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

这样的类仍然可以复制构造吗?
是的,是的。
只要你的类提供了

public
复制构造函数,你的类就是可复制构造的。

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

const
成员。

如果您的类具有

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

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

© www.soinside.com 2019 - 2024. All rights reserved.