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