社交媒体

浅拷贝和深拷贝(待补)

后面补

深拷贝与浅拷贝相对:当类/结构体包含指针成员时,深拷贝不会只复制指针的地址,而是会新分配一块内存,并把原指针指向的内容完整复制过去。

深拷贝通常需要你自己在拷贝构造函数和赋值运算符中实现。结果就是:原对象和副本对象各自拥有独立的数据,修改一个不会影响另一个。

举例对比

浅拷贝(默认)→ 共享数据

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 本身不是指针,默认拷贝已经做到了“值独立”的效果(即天然深拷贝)。只有当你手动管理堆内存(指针成员)时,才需要考虑自己实现深拷贝以避免共享数据。