2012-01-17 175 views
3

我已经将它钻入我的脑海许多次,如果提供了复制构造函数,还必须提供赋值运算符。但是,有时候类可以使用复制构造函数,但不能使用赋值运算符。C++复制构造函数和赋值

例如:

class A { 
public: 
    const int myVar; 

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

所以这是一件可怕的事是什么?是否需要定义赋值运算符,但将其设为私有?这样的班级是否仍然可以复制?

+0

这个类甚至不需要一个显式的拷贝构造函数,因为编译器生成一个完全是你想要的。 – 2012-01-17 19:03:59

+0

@ R.MartinhoFernandes:我假设这是一个简单的代码示例,用于表示问题。 – 2012-01-17 19:05:46

回答

3

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

这样的类还是可复制构建的吗?
是的。
只要你的课程提供了一个public拷贝构造函数,你的类就是复制可构造的。

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

如果您的班级拥有const成员,则默认的编译器生成的副本赋值运算符将不起作用,因为它会尝试分配给不允许的const成员。所以如果你的代码需要一个复制赋值操作符,你将不得不提供你自己的重载版本。但是,无论如何,这个重载版本不能提供预期的分配语义。

如果您的类对象不需要可赋值,则不要定义它。如果你的代码不小心使用了它,那么编译器会产生一个错误。

+0

它不需要分配,但它确实需要是可复制构建的。但我习惯总是被告知它是否有一个复制构造函数,它也必须有一个赋值操作符,但在这里没有意义。 – tpg2114 2012-01-17 19:00:39

+0

@ tpg2114:你在这里提到的是'C++ 03'中的**三级规则**或'C++ 11'中的**规则** **,但它在大多数情况下是准确的这不是标准强制执行的条件(尽管如果标准这样做会有所帮助)。类可以是可复制的,但不可以赋值,可以在指定案例时打破原则。 – 2012-01-17 19:04:28

+2

三/五条规则允许将一些必需项目声明为私有,并使其未实现。但是他们应该被宣布。你声明它们是因为你不希望编译器为你产生一些意想不到的事情,不是因为你打算实际使用它们。 – 2012-01-17 19:11:40

相关问题