深拷贝浅拷贝 c++
时间: 2024-05-25 15:07:33 浏览: 99
深拷贝和浅拷贝是C++中关于对象拷贝的概念。
浅拷贝是指将一个对象的值复制到另一个对象,这样两个对象将共享同一块内存。当其中一个对象修改了共享内存的值时,另一个对象也会受到影响。浅拷贝只是简单地复制了对象的成员变量的值,而没有复制指向动态分配内存的指针。
深拷贝是指将一个对象的值复制到另一个对象,但是两个对象拥有独立的内存空间。深拷贝会复制对象的所有成员变量,包括指向动态分配内存的指针。这样,当其中一个对象修改了自己的内存空间时,另一个对象不会受到影响。
下面是一个示例代码,演示了深拷贝和浅拷贝的区别:
```cpp
#include <iostream>
class MyClass {
public:
int* data;
// 构造函数
MyClass(int value) {
data = new int;
*data = value;
}
// 拷贝构造函数
MyClass(const MyClass& other) {
data = new int;
*data = *(other.data);
}
// 析构函数
~MyClass() {
delete data;
}
};
int main() {
// 浅拷贝示例
MyClass obj1(10);
MyClass obj2 = obj1; // 浅拷贝
std::cout << *obj1.data << std::endl; // 输出 10
std::cout << *obj2.data << std::endl; // 输出 10
*obj1.data = 20;
std::cout << *obj1.data << std::endl; // 输出 20
std::cout << *obj2.data << std::endl; // 输出 20,因为共享同一块内存
// 深拷贝示例
MyClass obj3(30);
MyClass obj4 = obj3; // 深拷贝
std::cout << *obj3.data << std::endl; // 输出 30
std::cout << *obj4.data << std::endl; // 输出 30
*obj3.data = 40;
std::cout << *obj3.data << std::endl; // 输出 40
std::cout << *obj4.data << std::endl; // 输出 30,因为拥有独立的内存空间
return 0;
}
```
在上面的代码中,`MyClass`类有一个指向动态分配内存的指针`data`。在浅拷贝示例中,当`obj2`被赋值为`obj1`时,它们共享同一块内存,因此修改其中一个对象的`data`值会影响另一个对象。而在深拷贝示例中,当`obj4`被赋值为`obj3`时,它们拥有独立的内存空间,因此修改其中一个对象的`data`值不会影响另一个对象。
需要注意的是,在使用深拷贝时,需要自定义拷贝构造函数和析构函数来确保正确地复制和释放动态分配的内存。
阅读全文