当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生什么?

时间:2014-09-28 14:08:56

标签: c++ variable-assignment copy-constructor assignment-operator assign

当我对具有复制构造函数但没有赋值运算符的对象进行赋值时会发生什么? 它会调用编译器的赋值运算符,执行成员复制吗?

4 个答案:

答案 0 :(得分:2)

所有类都有一个赋值运算符,除非你明确删除它(在C ++ 11之前不可能)。如果您不提供自己的实现,编译器将为您提供一个。

这是rule of three背后的主要原因:如果你有一个复制构造函数,几乎可以肯定你还需要一个赋值运算符和一个析构函数。

答案 1 :(得分:1)

是的,如果您没有提供默认的赋值运算符生成器,​​那么您将会通过编译器访问它。

但一般来说,如果一个类定义了下面的一个,它应该明确定义所有three

  • 复制构造函数
  • 复制分配操作员

答案 2 :(得分:1)

复制构造函数在赋值中不起作用,将调用默认赋值运算符,它将对class类型的对象成员执行内置类型成员和调用赋值运算符的逐位复制。

答案 3 :(得分:0)

我不知道赋值是什么意思(在编译器的上下文中)。所以,让我试试一个例子。让我们说我们有一个类测试;

Test a,c;          //default constructor would be called for both.

Test b = a;        //copy constructor would be called for b as we are creating that object.

c = b;             //assignment operator would be called for c as we are changing content's of c.

因此,如果类Test包含普通对象,那么如果你定义OR就没关系,编译器不会为你做逐位复制。但是如果你的类包含指针,那么你应该明确定义你的拷贝构造函数,赋值运算符和析构函数。

希望我足够清楚。