后面补
深拷贝与浅拷贝相对:当类/结构体包含指针成员时,深拷贝不会只复制指针的地址,而是会新分配一块内存,并把原指针指向的内容完整复制过去。
深拷贝通常需要你自己在拷贝构造函数和赋值运算符中实现。结果就是:原对象和副本对象各自拥有独立的数据,修改一个不会影响另一个。
举例对比
浅拷贝(默认)→ 共享数据
struct Node {
int* data;
Node(int val) { data = new int(val); }
// 默认拷贝构造:浅拷贝
};
Node a(100);
Node b = a; // b.data = a.data(地址相同)
*a.data = 999;
cout << *b.data; // 输出 999(被影响)
深拷贝 → 独立数据
struct Node {
int* data;
Node(int val) { data = new int(val); }
// 深拷贝构造
Node(const Node& other) {
data = new int(*other.data); // 新内存 + 复制值
}
};
Node a(100);
Node b = a; // b.data 指向新 int,值为 100
*a.data = 999;
cout << *b.data; // 输出 100(不受影响)
时间复杂度
深拷贝 = O(n),其中 n 是所指向数据的大小(这里是 1 个 int,O(1);如果是数组,则是 O(数组长度))。
相比浅拷贝的 O(1),深拷贝更耗时,但保证了数据独立性。
你的疑问延续
你之前问浅拷贝输出 1 的例子(成员是 int),深拷贝的概念不直接适用,因为 int 本身不是指针,默认拷贝已经做到了“值独立”的效果(即天然深拷贝)。只有当你手动管理堆内存(指针成员)时,才需要考虑自己实现深拷贝以避免共享数据。