1.浅拷贝(Shallow Copy):
浅拷贝是指在对象复制时,只是复制对象的值,而不会复制对象指向的资源。这意味着对象和其副本会指向同一块内存空间,当一个对象改变时,另一个对象也会受到影响。
#include <iostream>
using namespace std;
class ShallowCopy
{
private:
int* data;
public:
ShallowCopy(int val)
{
data = new int;
*data = val;
}
// 浅拷贝构造函数
ShallowCopy(const ShallowCopy& other)
{
data = other.data; //注意:赋值的是地址
}
int getData()
{
return *data;
}
void setData(int val)
{
*data = val;
}
~ShallowCopy()
{
delete data;
}
};
在上面的例子中,浅拷贝构造函数只是简单地将指针 `data` 复制给新对象,导致两个对象共享相同的指针,容易出现潜在的问题。
2.深拷贝(Deep Copy):
深拷贝是指在对象复制时,会复制对象指向的资源,而不是简单地复制指针。这样就可以避免多个对象共享同一资源带来的问题。
#include <iostream>
using namespace std;
class DeepCopy
{
private:
int* data;
public:
DeepCopy(int val) {
data = new int;
*data = val;
}
// 深拷贝构造函数
DeepCopy(const DeepCopy& other)
{
data = new int; //注意:重新分配了内存,赋值的是值
*data = *other.data;
}
int getData() {
return *data;
}
void setData(int val) {
*data = val;
}
~DeepCopy() {
delete data;
}
};
在上面的例子中,深拷贝构造函数会分配新的内存,将原对象的数据复制给新对象,从而避免了对象共享同一资源的问题。
//下面是一个示例代码演示了浅拷贝和深拷贝的区别:
int main()
{
// 浅拷贝示例:修改obj2的值会影响obj1的值
ShallowCopy obj1(10);
ShallowCopy obj2 = obj1;
obj2.setData(5);
cout << "Shallow copy: " << obj1.getData() << endl;
// 深拷贝示例:修改obj4的值不会影响obj3的值
DeepCopy obj3(10);
DeepCopy obj4 = obj3;
obj4.setData(5);
cout << "Deep copy: " << obj3.getData() << endl;
return 0;
}
运行结果:
根据运行结果可以看出,浅拷贝会导致两个对象共享同一资源,而深拷贝会将资源复制给新对象,避免了共享资源带来的问题。
选择何种方式需要根据具体情况而定,对于包含指针成员的类,通常应当考虑使用深拷贝,以避免潜在的问题。