7.1.3-1基本类型数据浅复制和深复制.pptVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
7.1.3-1 基本类型数据的浅复制与深复制 7.1.3-1 基本类型数据的浅复制与深复制 7.1.3-2 对象的浅复制与深复制 7.1.3-2 对象的浅复制与深复制 7.1.3-2 对象的浅复制与深复制 7.1.3-2 对象的浅复制与深复制 例7.4  实现深复制 例7.4  实现深复制 例7.4  实现深复制 例7.4  实现深复制 例7.4  实现深复制 7.1.3 对象的浅复制与深复制 7.1.3 对象的浅复制与深复制 7.1.3 对象的浅复制与深复制 7.2 链表与链表的基本操作 * * 浅复制:将一个动态分配的基本类型数据复制给另一个。若只赋值指针值、不复制指向的目标内容,称为浅复制。 图7.1a 浅复制 p2 自由存储区1 p1 复制前 复制后 p1 自由存储区1 p2 自由存储区2 自由存储区2 int *p1=new int [maxsz] ; int *p2=new int [maxsz] ; p2=p1; 深复制:复制指向的目标内容,而非复制指针值,称为深复制。 图7.1b 深复制 p1 自由存储区1 复制前 复制后 p2 自由存储区2 自由存储区1 p1 p2 自由存储区2 int *p1=new int [maxsz] ; int *p2=new int [maxsz] ; int i; for(i=0;i10;i++) *(p2+i)=*(p1+i); 浅复制:调用默认复制构造函数,可用一个类对象初始化另一个类对象,称为默认的按成员复制,而不是对整个类对象的按位复制。这称为浅复制。 图7.1 浅复制 p 自由存储区数据 自由存储区数据 p p 复制前 复制后 如果类中有一个数据成员为指针,该类的一个对象obj1中的这个指针p,指向了动态分配的一个自由存储区数据,(参见图7.1复制前),如果用obj1按成员复制了一个对象obj2,这时obj2.p也指向同一个自由存储区数据。 obj1 obj1 obj2 本质上,对象与复制所得对象共享一个自由存储数据。 即两对象的成员指针一同指向了一个动态数据。 浅复制引发的问题: 图7.1 浅复制 p 自由存储区数据 自由存储区数据 p p 复制前 复制后 obj1 obj1 obj2 当析构时,如用默认的析构函数,则动态分配的自由存储区数据不能回收。如果在析构函数中有“delete p;”语句,则当先析构函数obj1时,自由存储区数据释放,以后再析构obj2时出现了二次释放的问题,反之亦然。 自由存储区数据1 p p 自由存储区数据2 图7.2 深复制 深复制:重新定义复制的构造函数,给每个对象独立分配一个自由存储区并复制数据内容,称深复制。 复制构造过程:先复制对象主体,再为obj2分配一个自由存储区空间,最后将obj1的自由存储区数据逐一复制给obj2的自由存储区空间。 obj1 obj2 【例7.4】定义复制构造函数 (copy structor)和复制赋值操作符(copy Assignment Operator)实现深复制。 学生类定义: class student { char *pName; //为了演示深复制,不用string类 public: student (); //默认构造函数 student ( char *pname );//带参数构造函数 student ( student s); //复制构造函数 ~student ( ); //析构函数 student operator = (student s); //复制赋值操作符 }; 检验主函数和运行结果 默认构造函数: student :: student() { cout Constructor; pName = NULL; cout “缺省“ endl; } 带参数构造函数: student :: student( char *pname ) { cout Constructor; if ( pName = new char [strlen(pname)+1] ) strcpy ( pName, pname ); cout pName endl; } 复制构造函数: student :: student ( student s ) { cout Copy Constructor; if ( s.pName ) { if ( pName = new char [strlen(s.pName)+1] ) strcpy(pName, s.pName); c

文档评论(0)

aa15090828118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档