什么是深拷贝和浅拷贝?请给出示例。
深拷贝和浅拷贝是C++中处理对象复制时的两种不同方式,主要涉及到对象中指针成员的复制问题。
- 浅拷贝(Shallow Copy):
- 浅拷贝仅复制对象的成员值,如果成员包含指针,则仅复制指针的值(即内存地址),而不复制指针所指向的实际数据。
- 这意味着原始对象和拷贝对象的指针成员将指向相同的内存地址。
- 浅拷贝通常是默认的复制行为。
示例:
假设有一个类SimpleClass
,其中有一个指向int
类型的指针成员。使用默认的复制构造函数(浅拷贝)来复制SimpleClass
的实例时,新对象的指针成员将指向与原始对象相同的内存地址。class SimpleClass { public: int* ptr; SimpleClass(int val) { ptr = new int(val); } }; SimpleClass obj1(10); SimpleClass obj2 = obj1; // 浅拷贝
在这种情况下,
obj1
和obj2
的ptr
指向同一个内存地址。
- 深拷贝(Deep Copy):
- 深拷贝不仅复制对象的成员值,如果成员包含指针,则还会复制指针所指向的数据到新的内存地址。
-
这样,原始对象和拷贝对象的指针成员将指向不同的内存地址,它们互不影响。
示例:
修改上面的SimpleClass
,以实现深拷贝。class SimpleClass { public: int* ptr; SimpleClass(int val) { ptr = new int(val); } // 深拷贝构造函数 SimpleClass(const SimpleClass &obj) { ptr = new int(*obj.ptr); } }; SimpleClass obj1(10); SimpleClass obj2 = obj1; // 深拷贝
在这种情况下,
obj1
和obj2
的ptr
指向不同的内存地址。
深拷贝通常在对象含有动态分配的内存或资源时使用,以确保每个对象都有其自己的独立副本,避免资源共享导致的问题,如多次释放同一资源。