c ++默认复制和赋值运算符

时间:2012-02-20 20:32:46

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

我有班级

class Circle : public isCircle{
   private :
   int x;
   int y;
   vector<Circle*> _neighbors;
}

其中isCircle只是一个接口(使用虚方法),并且_neighbors包含指针的Circles未被此实例分配。 我的问题是,在这种情况下,默认的复制和赋值运算符基本上会做深度复制吗?

2 个答案:

答案 0 :(得分:9)

C ++类型的默认复制构造函数的工作原理是,在实例中的每个字段上调用复制构造函数,并在创建副本的对象中使用相应的字段。在您的示例中,它大致转换为

Circle(const Circle& other) :
  x(other.x),
  y(other.y),
  _neighobrs(other._neighbors) {

}

副本是否深层是每个字段的复制构造函数的实现细节。在这种情况下,vector<T>的复制构造函数有点混合。它将深度复制底层存储,使每个vector<T>拥有它自己的独立数组。但是,它将使用复制构造函数复制元素。在这种情况下,它是一个指针类型,因此它们以浅层方式复制

答案 1 :(得分:0)

默认生成的拷贝构造函数和赋值运算符执行浅拷贝。

如果你在这些类的实例之间共享指针,我建议不要使用指针向量,而是有一个智能指针向量。