拷贝构造函数的深拷贝和浅拷贝分别怎么用,谢谢
时间: 2024-05-16 08:13:50 浏览: 7
拷贝构造函数是一个特殊的成员函数,用于将一个对象作为参数传递给另一个对象时,创建一个新的对象并将传递的对象的内容复制到新对象中。拷贝构造函数有两种拷贝方式:深拷贝和浅拷贝。
浅拷贝只是将对象的成员变量逐个复制到新对象中。如果原始对象中有指针类型的成员变量,那么浅拷贝只会复制指针的地址,而不是复制指针所指向的内容。这会导致新旧对象共享同一块内存,可能会出现悬挂指针等问题。
深拷贝会在新对象中重新分配内存,并将原始对象中的成员变量复制到新分配的内存中。这样可以避免新旧对象共享同一块内存的问题,但也会增加内存的使用量和复制的时间。
下面是深拷贝和浅拷贝的用法示例:
```c++
#include <iostream>
#include <cstring>
using namespace std;
class Person {
public:
char *name;
int age;
// 深拷贝
Person(const Person &p) {
name = new char[strlen(p.name) + 1];
strcpy(name, p.name);
age = p.age;
}
// 浅拷贝
// Person(const Person &p) {
// name = p.name;
// age = p.age;
// }
Person(const char *n, int a) {
name = new char[strlen(n) + 1];
strcpy(name, n);
age = a;
}
~Person() {
delete[] name;
}
};
int main() {
Person p1("Tom", 20);
Person p2 = p1; // 使用拷贝构造函数进行拷贝
p2.name[0] = 'J'; // 修改p2的name
cout << "p1: name=" << p1.name << ", age=" << p1.age << endl;
cout << "p2: name=" << p2.name << ", age=" << p2.age << endl;
return 0;
}
```
在上面的示例中,我们定义了一个 `Person` 类,包含了 `name` 和 `age` 两个成员变量。然后我们定义了一个拷贝构造函数,用来进行深拷贝和浅拷贝。
在 `main` 函数中,我们创建了一个 `Person` 对象 `p1`,然后使用拷贝构造函数进行拷贝,得到了一个新的 `Person` 对象 `p2`。接着我们修改了 `p2` 的 `name`,并输出了 `p1` 和 `p2` 的信息。如果我们使用的是浅拷贝,那么 `p1` 和 `p2` 的 `name` 将会是相同的,因为它们共享同一块内存。但是由于我们使用的是深拷贝,所以 `p1` 和 `p2` 的 `name` 将会是不同的。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)