📜  C++中的浅复制和深复制(1)

📅  最后修改于: 2023-12-03 15:29:54.583000             🧑  作者: Mango

C++中的浅复制和深复制

在C++程序设计中,关于对象的复制和传递常常会涉及到浅复制和深复制的概念。

浅复制

浅复制是指将对象进行赋值或者复制时,只是将对象的指针拷贝一份,两个对象指向同一个地址,因此对一个对象的操作会影响到另一个对象。例如:

#include <iostream>
using namespace std;

class ShallowCopy{
public:
    int * data;

    ShallowCopy(int d = 0){
        data = new int(d);
    }

    ShallowCopy(ShallowCopy & c){
        data = c.data;
    }

    ~ShallowCopy(){
        delete data;
    }
};

int main(){
    ShallowCopy a(5);
    ShallowCopy b(a);   // 浅复制
    *b.data = 10;
    cout << *a.data << endl;    // 输出10
    return 0;
}

上述例子中,我们定义了一个ShallowCopy类,其中包含一个int型指针data,并分别定义了一个对象a和对象b,其中b通过对a进行赋值而生成,即进行了浅复制。由于浅复制只是将指针拷贝了一份,因此对b的操作会直接作用于a。

深复制

与浅复制不同,深复制是指将对象重新生成一份,并将对象的所有指针都指向新生成的地址,从而实现对象的复制。例如:

#include<iostream>
using namespace std;

class DeepCopy{
public:
    int * data;

    DeepCopy(int d = 0){
        data = new int(d);
    }

    DeepCopy(const DeepCopy & c){
        data = new int(*c.data);    // 深复制
    }

    ~DeepCopy(){
        delete data;
    }
};

int main(){
    DeepCopy a(5);
    DeepCopy b(a);    // 深复制
    *b.data = 10;
    cout << *a.data << endl;    // 输出5
    return 0;
}

在上方例子中,我们同样定义了一个DeepCopy类,其中b也通过对a进行复制生成,不同的是,在DeepCopy类的构造函数中,我们使用new分配了一块新的内存,并将data指向它。这样,对b的修改不会影响a的值。

需要注意的是,在使用深复制时,需要重载赋值运算符,并在析构函数中释放动态分配的内存。