ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C++ 浅拷贝与深拷贝

2022-07-03 10:36:24  阅读:143  来源: 互联网

标签:cout 堆区 hight C++ Person 内存 拷贝


C++类中 会默认有一个拷贝函数 用于拷贝类的值 

 1 class Person {
 2 public:
 3     Person() {
 4         cout << "person的无参构造函数!" << endl;
 5     }
 6     Person(int age, int hight) {
 7         p_age = age;
 8         p_hight = new int(hight);
 9         cout << "person的有参构造函数!" << endl;
10     }
11     //默认拷贝函数的原理
12     Person(const Person & p) {
13         p_age = p.p_age;
14         p_hight = p.p_hight;
15         cout << "person的拷贝函数!" << endl;
16     }
17     ~Person() {
18         if (p_hight != NULL) {
19             delete p_hight;
20             p_hight = NULL;
21         }
22         cout << "person的析构函数!" << endl;
23     }
24     int p_age;
25     int* p_hight;
26 };

这就是浅拷贝,当我们需要释放内存的时候,由于两个类申明的变量都使用的同一个堆区内存,当其中一个释放之后,另一个变量也会执行释放,这时候就会报错

 

 所以我们需要将浅拷贝转换成深拷贝,就是在使用堆区内存时,重新开辟一块堆区内存,然后重新赋值

1 //深拷贝
2     Person(const Person & p) {
3         p_age = p.p_age;
4         p_hight = new int(*p.p_hight);
5         cout << "person的拷贝函数!" << endl;
6     }

这里需要注意的事因为p_hight是指针变量,而int() 内需要一个值,所以需要堆p_hight进行解引用

标签:cout,堆区,hight,C++,Person,内存,拷贝
来源: https://www.cnblogs.com/limu-zy/p/16439352.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有