我有班级
class Circle : public isCircle{
private :
int x;
int y;
vector<Circle*> _neighbors;
}
其中isCircle
只是一个接口(使用虚方法),并且_neighbors包含指针的Circles未被此实例分配。
我的问题是,在这种情况下,默认的复制和赋值运算符基本上会做深度复制吗?
答案 0 :(得分:9)
C ++类型的默认复制构造函数的工作原理是,在实例中的每个字段上调用复制构造函数,并在创建副本的对象中使用相应的字段。在您的示例中,它大致转换为
Circle(const Circle& other) :
x(other.x),
y(other.y),
_neighobrs(other._neighbors) {
}
副本是否深层是每个字段的复制构造函数的实现细节。在这种情况下,vector<T>
的复制构造函数有点混合。它将深度复制底层存储,使每个vector<T>
拥有它自己的独立数组。但是,它将使用复制构造函数复制元素。在这种情况下,它是一个指针类型,因此它们以浅层方式复制
答案 1 :(得分:0)
默认生成的拷贝构造函数和赋值运算符执行浅拷贝。
如果你在这些类的实例之间共享指针,我建议不要使用指针向量,而是有一个智能指针向量。