c++ 深拷浅拷贝学习代码

  1 #include <cstring>
  2 #include <iostream> // 标准的输入输出
  3 using namespace std;
  4 
  5 class Person {
  6 public:
  7     Person()
  8     {
  9     }
 10     Person(char const* name, int age)
 11     {
 12     ¦   m_Name = (char*)malloc(strlen(name) + 1);
 13     ¦   strcpy(m_Name, name);
 14     ¦   m_age = age;
 15     }
 16     
 17     // 姓名
 18     char* m_Name;
 19     // 年龄
 20     int m_age;
 21     
 22     // 拷贝构造,系统会提供默认的拷贝构造,而且是简单的值拷贝
 23     // 自己提供拷贝函数,原因是简单的浅拷贝会释放堆区两次,导致程序崩掉
 24     // 深拷贝
 25     Person(const Person& p)
 26     {
 27     ¦   m_age = p.m_age;
 28     ¦   m_Name = (char*)malloc(strlen(p.m_Name) + 1);
 29     ¦   strcpy(m_Name, p.m_Name);
 30     }
 31     
 32     ~Person()
 33     {
 34     ¦   cout << "调用析构函数" << endl;
 35     ¦   // 释放堆区
 36     ¦   if (m_Name != NULL) {
 37     ¦   ¦   free(m_Name);
 38     ¦   ¦   m_Name = NULL;
 39     ¦   }
 40     }
 41 };
 42 
 43 void test1()
 44 {
 45     Person p1("张三", 15);
 46 
 47     Person p2(p1); // 调用拷贝构造函数
 48 }
 49 int main()
 50 {
 51     test1();
 52     return 0;
 53 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值