我已经多次在脑海中反复思考,如果提供了复制构造函数,则还必须提供赋值运算符。但是,有时类可以使用复制构造函数,但不能使用赋值运算符。
例如:
class A {
public:
const int myVar;
A(const int var) : myVar(var) {};
A(const A& other) : myVar(other.myVar) {};
};
那么这是一件可怕的事情吗?赋值运算符是否需要定义但设为私有?这样的类仍然可以复制构造吗?
那么这是一件可怕的事情吗?
不,不是。
并非所有类都需要可复制构造和可赋值。拥有可复制构造但不可分配的类是完全有效的。
这样的类仍然可以复制构造吗?
是的,是的。
只要你的类提供了
public
复制构造函数,你的类就是可复制构造的。
赋值运算符是否需要定义但设为私有?
这取决于您的用途。
如果您的班级需要可分配,那么理想情况下它应该没有
const
成员。
如果您的类具有
const
成员,默认编译器生成的复制赋值运算符将不起作用,因为它尝试分配给不允许的 const 成员。因此,如果您的代码需要复制赋值运算符,您将必须提供自己的重载版本。但是,无论如何,这个重载版本无法提供预期的赋值语义。
如果您的类对象不需要是可分配的,那么就不要定义它。如果您的代码不小心使用了它,编译器无论如何都会生成错误。