C++浅拷贝和深拷贝的实例
时间: 2024-06-16 09:07:33 浏览: 134
在 C++ 中,当一个类的对象被复制时,有两种拷贝方式:浅拷贝和深拷贝。
浅拷贝是指将一个对象的数据成员逐个地复制到另一个对象中,这样两个对象共享同一块内存空间。如果其中一个对象修改了这块内存,那么另一个对象也会受到影响。
深拷贝是指将一个对象的数据成员逐个地复制到另一个对象中,但是对于指针类型的数据成员,会为它们分配新的内存空间,并将原来指针指向的内容复制到新的内存空间中。这样两个对象拥有独立的内存空间,彼此之间互不干扰。
以下是一个浅拷贝和深拷贝的实例:
```cpp
#include <iostream>
#include <cstring>
class Person {
public:
Person(const char* n, int a) : age(a) {
name = new char[strlen(n) + 1];
strcpy(name, n);
}
// 拷贝构造函数
Person(const Person& other) {
age = other.age;
name = other.name;
}
// 析构函数
~Person() {
delete[] name;
}
// 输出信息
void printInfo() {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
private:
char* name;
int age;
};
int main() {
Person p1("Tom", 20);
Person p2 = p1; // 浅拷贝
p1.printInfo(); // 输出 "Name: Tom, Age: 20"
p2.printInfo(); // 输出 "Name: Tom, Age: 20"
p1.~Person(); // 销毁 p1 的 name 指针
p2.printInfo(); // 输出 "Name: Tom, Age: 20",name 指针已被销毁,p2 中的 name 指针变成了野指针
return 0;
}
```
上述代码中,我们定义了一个 Person 类,其中有一个字符串类型的数据成员 name。在拷贝构造函数中,我们只是简单地将 age 和 name 的值从一个对象复制到了另一个对象中,这是一种浅拷贝。当 p1 被销毁时,它的 name 指针被释放了。由于 p2 和 p1 共享同一块内存空间,所以当 p2.printInfo() 被调用时,name 指针已经被销毁,p2 中的 name 指针变成了野指针。
接下来是深拷贝实现:
```cpp
#include <iostream>
#include <cstring>
class Person {
public:
Person(const char* n, int a) : age(a) {
name = new char[strlen(n) + 1];
strcpy(name, n);
}
// 拷贝构造函数
Person(const Person& other) {
age = other.age;
name = new char[strlen(other.name) + 1];
strcpy(name, other.name);
}
// 析构函数
~Person() {
delete[] name;
}
// 输出信息
void printInfo() {
std::cout << "Name: " << name << ", Age: " << age << std::endl;
}
private:
char* name;
int age;
};
int main() {
Person p1("Tom", 20);
Person p2 = p1; // 深拷贝
p1.printInfo(); // 输出 "Name: Tom, Age: 20"
p2.printInfo(); // 输出 "Name: Tom, Age: 20"
p1.~Person(); // 销毁 p1 的 name 指针
p2.printInfo(); // 输出 "Name: Tom, Age: 20",name 指针已经被复制,不会出现野指针
return 0;
}
```
上述代码中,在拷贝构造函数中我们不仅将 age 和 name 的值从一个对象复制到了另一个对象中,还为 name 分配了新的内存空间,并将原来指针指向的内容复制到新的内存空间中。这样两个对象拥有独立的内存空间,彼此之间互不干扰。
阅读全文