前言:
深拷贝和浅拷贝是在对象拷贝过程中涉及的概念,主要用于描述拷贝操作对于对象内部数据的处理方式。
概念:
浅拷贝(Shallow Copy)是指在拷贝对象时,仅仅复制对象的成员变量的值,包括指针成员的值也会被复制,但指针所指向的数据并不会被复制。即,原始对象和拷贝对象将共享同一份数据,修改其中一个对象的数据会影响另一个对象。浅拷贝通常是通过默认的拷贝构造函数或赋值运算符来实现的。
深拷贝(Deep Copy)则是在拷贝对象时,不仅复制对象的成员变量的值,还会复制指针所指向的数据。即,创建了一个独立的副本,原始对象和拷贝对象之间的数据是完全独立的。修改其中一个对象的数据不会影响另一个对象。深拷贝通常需要自定义拷贝构造函数和赋值运算符重载来实现,确保指针所指向的数据也被复制。
需注意:深拷贝和浅拷贝的适用场景取决于对象的内部数据结构和资源管理方式。对于简单的数据类型,如整数、浮点数等,浅拷贝已经足够。但对于包含动态分配内存或其他资源的对象,通常需要使用深拷贝来避免资源管理问题。
示例:
#include <iostream>
class Resource {
public:
int* data;
Resource() {
data = new int(0);
}
~Resource() {
delete data;
}
};
class Object {
public:
Resource* resource;
Object() {
resource = new Resource();
}
// 深拷贝构造函数
Object(const Object& other) {
resource = new Resource();
*(resource->data) = *(other.resource->data);
}
// 赋值运算符重载
Object& operator=(const Object& other) {
if (this != &other) {
delete resource;
resource = new Resource();
*(resource->data) = *(other.resource->data);
}
return *this;
}
~Object() {
delete resource;
}
};
int main() {
Object obj1;
Object obj2 = obj1; // 深拷贝
*(obj1.resource->data) = 10;
std::cout << *(obj2.resource->data) << std::endl; // 输出0,不受obj1的修改影响
Object obj3;
Object obj4;
obj4 = obj3; // 深拷贝
*(obj3.resource->data) = 20;
std::cout << *(obj4.resource->data) << std::endl; // 输出0,不受obj3的修改影响
return 0;
}
其中,Object 类包含一个指向 Resource 类的指针成员 resource。Resource 类中有一个指向整数的指针成员 data。
通过自定义拷贝构造函数和赋值运算符重载,Object 类实现了深拷贝。当对象进行拷贝时,会创建一个独立的 Resource 对象,并复制其中的数据。这样,对原始对象和拷贝对象进行数据修改时互不影响。
1493

被折叠的 条评论
为什么被折叠?



