📅  最后修改于: 2023-12-03 15:29:54.583000             🧑  作者: Mango
在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的值。
需要注意的是,在使用深复制时,需要重载赋值运算符,并在析构函数中释放动态分配的内存。