深拷贝与浅拷贝
Posted loliconinvincible
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝与浅拷贝相关的知识,希望对你有一定的参考价值。
1 class Person 2 { 3 private: 4 char *m_name; 5 int m_num; 6 public: 7 Person() 8 { 9 m_name = NULL; 10 m_num = 0; 11 cout<<"无参构造"<<endl; 12 } 13 Person(char *name,int num) 14 { 15 //为m_name申请空间 16 m_name = (char *)calloc(1,strlen(name)+1); 17 if(m_name == NULL) 18 { 19 cout<<"构造失败"<<endl; 20 } 21 cout<<" 已经申请好空间"<<endl; 22 strcpy(m_name,name); 23 m_num = num; 24 cout<<"有参构造"<<endl; 25 } 26 27 Person(const Person &ob)//ob==>lucy 28 { 29 cout<<"拷贝构造函数"<<endl; 30 m_name = (char *)calloc(1, strlen(ob.m_name)+1); 31 cout<<"空间已被申请"<<endl; 32 strcpy(m_name, ob.m_name); 33 34 m_num = ob.m_num; 35 } 36 37 ~Person() 38 { 39 if(m_name != NULL) 40 { 41 cout<<"空间已被释放"<<endl; 42 free(m_name); 43 m_name = NULL; 44 } 45 cout<<"析构函数"<<endl; 46 } 47 48 void showPerson(void) 49 { 50 cout<<"m_name = "<<m_name<<", m_num = "<<m_num<<endl; 51 } 52 }; 53 54 void test01() 55 { 56 Person lucy("lucy",100); 57 lucy.showPerson(); 58 59 //浅拷贝的问题(多次释放同一块堆区空间) 60 //通过自定义 拷贝构造函数 完成深拷贝动作 61 Person bob = lucy;//调用系统的默认拷贝构造(单纯的值拷贝) 62 }
如果类中的成员 指向了堆区空间 一定要记得在析构函数中 释放该空间
如果用户 不实现 拷贝构造 系统就会提供默认拷贝构造
而默认拷贝构造 只是单纯的赋值 容易造成浅拷贝问题
用户记得 要实现:无参构造(初始化数据)、有参构造(赋参数)、拷贝构造(深拷贝) 、析构函数(释放空间)
以上是关于深拷贝与浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章