深拷贝与浅拷贝的例子
时间: 2024-06-20 08:03:49 浏览: 46
深拷贝和浅拷贝是常用的两种对象复制方法。浅拷贝只是复制指针,而不是复制数据;深拷贝则会完全复制数据。下面分别举例说明:
- 浅拷贝
假设有一个类A,其中包含一个指向动态分配内存的指针p,当进行浅拷贝时,只是复制了指针p,而没有复制指针p所指向的数据。
```
class A {
public:
int* p;
A(int n) {
p = new int[n];
for (int i = 0; i < n; i++) {
p[i] = i;
}
}
A(const A& a) { // 浅拷贝构造函数
p = a.p;
}
~A() {
delete[] p;
}
};
int main() {
A a1(5);
A a2(a1); // 调用浅拷贝构造函数
a1.p = 10;
cout << a2.p << endl; // 输出结果为 10
return 0;
}
```
在上述代码中,我们先创建了一个对象a1,并将其第一个元素修改为10。然后我们又创建了一个对象a2,调用了A的浅拷贝构造函数,此时a2.p和a1.p指向同一块内存,因此a2.p的值也变成了10。
- 深拷贝
当进行深拷贝时,需要自行定义一个拷贝构造函数来进行数据的复制。下面是一个简单的深拷贝例子:
```
class B {
public:
int* p;
B(int n) {
p = new int[n];
for (int i = 0; i < n; i++) {
p[i] = i;
}
}
B(const B& b) { // 深拷贝构造函数
p = new int;
for (int i = 0; i < 5; i++) {
p[i] = b.p[i];
}
}
~B() {
delete[] p;
}
};
int main() {
B b1(5);
B b2(b1); // 调用深拷贝构造函数
b1.p = 10;
cout << b2.p << endl; // 输出结果为 0
return 0;
}
```
在上述代码中,我们也先创建了一个对象b1,并将其第一个元素修改为10。然后我们又创建了一个对象b2,调用了B的深拷贝构造函数,此时b2.p和b1.p指向不同的内存空间,因此b2.p的值还是原来的0。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.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)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)