深拷贝与浅拷贝的区别,并举一个例子
时间: 2024-06-20 15:03:28 浏览: 105
在 C++ 中,对象的复制通常使用拷贝构造函数和赋值运算符实现,其中拷贝构造函数和赋值运算符有两种不同的实现方式:深拷贝和浅拷贝。
浅拷贝是指将一个对象的值复制到另一个对象中,两个对象共享同一块内存空间,修改其中一个对象的值会同时修改另一个对象的值。而深拷贝则是将一个对象的值复制到另一个对象中,两个对象有各自独立的内存空间,修改其中一个对象的值不会影响另一个对象的值。
下面是一个例子,演示深拷贝与浅拷贝的区别:
```c++
#include <iostream>
#include <cstring>
using namespace std;
class Person {
public:
int age;
char* name;
// 默认构造函数
Person() {
age = 0;
name = nullptr;
}
// 拷贝构造函数
Person(const Person& other) {
age = other.age;
name = new char[strlen(other.name) + 1];
strcpy(name, other.name);
}
// 赋值运算符
Person& operator=(const Person& other) {
if (this != &other) {
age = other.age;
delete[] name;
name = new char[strlen(other.name) + 1];
strcpy(name, other.name);
}
return *this;
}
// 析构函数
~Person() {
delete[] name;
}
};
int main() {
// 浅拷贝
Person p1;
p1.age = 18;
p1.name = new char;
strcpy(p1.name, "Alice");
Person p2 = p1;
cout << "p1.age: " << p1.age << ", p1.name: " << p1.name << endl;
cout << "p2.age: " << p2.age << ", p2.name: " << p2.name << endl;
p2.age = 20;
strcpy(p2.name, "Bob");
cout << "p1.age: " << p1.age << ", p1.name: " << p1.name << endl;
cout << "p2.age: " << p2.age << ", p2.name: " << p2.name << endl;
// 深拷贝
Person* p3 = new Person();
p3->age = 18;
p3->name = new char;
strcpy(p3->name, "Alice");
Person* p4 = new Person(*p3);
cout << "p3->age: " << p3->age << ", p3->name: " << p3->name << endl;
cout << "p4->age: " << p4->age << ", p4->name: " << p4->name << endl;
p4->age = 20;
strcpy(p4->name, "Bob");
cout << "p3->age: " << p3->age << ", p3->name: " << p3->name << endl;
cout << "p4->age: " << p4->age << ", p4->name: " << p4->name << endl;
delete[] p1.name;
delete[] p3->name;
delete p3;
delete p4;
return 0;
}
```
在上面的例子中,我们定义了一个 Person 类,并在其中定义了浅拷贝和深拷贝的实现方式。在 `main` 函数中,我们首先演示了浅拷贝的效果,可以看到修改 `p2` 的属性后,`p1` 的属性也跟着改变了。然后演示了深拷贝的效果,可以看到修改 `p4` 的属性后,`p3` 的属性没有改变。
阅读全文