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;
}
运行结果:
根据运行结果可以看出,浅拷贝会导致两个对象共享同一资源,而深拷贝会将资源复制给新对象,避免了共享资源带来的问题。
选择何种方式需要根据具体情况而定,对于包含指针成员的类,通常应当考虑使用深拷贝,以避免潜在的问题。