《浅拷贝和深拷贝》PPT课件

《浅拷贝和深拷贝》PPT课件

ID:39610355

大小:237.34 KB

页数:37页

时间:2019-07-07

《浅拷贝和深拷贝》PPT课件_第1页
《浅拷贝和深拷贝》PPT课件_第2页
《浅拷贝和深拷贝》PPT课件_第3页
《浅拷贝和深拷贝》PPT课件_第4页
《浅拷贝和深拷贝》PPT课件_第5页
资源描述:

《《浅拷贝和深拷贝》PPT课件》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、一、浅拷贝和深拷贝二、只读成员函数三、友元friend第16章数据的共享和流通1一、浅拷贝和深拷贝对象作为数据的集合,其中有些数据需要与变量进行流通,有些数据需由不同的对象共享。本章介绍的深拷贝、友元函数、静态成员和指向成员的指针就是在不同的方面加快信息流动以及实施对象的保护的。2存在两种形式的类。一种形式的类中仅存在变量或对象,不具备指针成员。缺省的拷贝构造函数和赋值运算符函数是浅拷贝的方式,该方式通过memcpy函数将源实例的数据复制给目标实例占住的一片内存空间。对于这样的类,缺省的浅拷贝方式是安全的。另一种形式的类含有指针成员,浅拷贝不再胜任这样的类。3考虑如

2、下说明:从上可见对于存在指针成员的类,系统提供的浅拷贝导致指针指向的内存为两个对象共享的格局。一个CDeep类的声明和对象定义a.na.pa.p=newint[a.n]b.nb.pb.p=newint[b.n]??=newint[b.n]a.na.pa.p=newint[a.n]b.nb.p对象a,b的内存和指针成员动态扩展的内存空间b=a导致[b.p=a.p;b.n=a.n;]。指针b.p指向a对象的动态内存。classCDeep{intn;int*p;}a,b;中间深资源归口两个对象监控4浅拷贝的不良结果是:b.p原先指向的堆空间悬空----既无法索引也不能收回

3、这片内存,a或b对象的析构函数诱发中间共享的深资源的流失。对于凡是具有指针成员的类,应细致提交两个函数:一.是拷贝构造函数,二.是赋值运算符函数,以便进行指针成员的动态资源的深拷贝。深拷贝的核心思路是:1.目标对象与源对象内存空间独立,相应指针成员指向的内存空间也彼此独立。2.全部拷贝源对象的数据到目标对象,包括分别拷贝指针成员指向的内存数据。5[例]深拷贝方式(去掉定制的拷贝构造函数和赋值运算符函数则变成缺省的浅拷贝)#include#includeclassCDeep{public:intn;int*p;CDeep(int)

4、;~CDeep();CDeep(constCDeep&r);CDeep&operator=(constCDeep&r);};6CDeep::~CDeep(){staticints_num=1;printf("%d.~CDeep()t",s_num++);delete[]p;}CDeep::CDeep(intk){n=k;p=newint[n];}CDeep&CDeep::operator=(constCDeep&r){if(n!=r.n){delete[]p;n=r.n;p=newint[n];}memcpy(p,r.p,n*sizeof(int));return

5、*this;}7CDeep::CDeep(constCDeep&r){n=r.n;p=newint[n];memcpy(p,r.p,n*sizeof(int));}voidmain(){CDeepa(2),d(3);a.p[0]=1;d.p[0]=666;{CDeepb(d);a.p[0]=88;b=a;printf("%d;",b.p[0]);}printf("%d;",d.p[0]);printf("bfadeoutaway;t");printf("%d;",a.p[0]);}8程序输出:88;1.~CDeep()666;bfadeoutaway;88;2.~

6、CDeep()3.~CDeep()删除上面的拷贝构造函数和等号赋值运算符函数时,程序运行输出:88;1.~CDeep()666;bfadeoutaway;-572662307;2.~CDeep()3.~CDeep()之后弹出一个DebugAssertionFailed!的警告对话框。原因在于b对象退出作用范围后导致析构函数的调用,析构函数释放原来由a对象拥有的深部堆中资源,其后对该内存空间的操作a.d[0]就等于在没有定义的内存空间进行寻址访问,因而是运行时的错误。9二、只读成员函数volatile,mutable关键字1.只读成员函数未经const或volatil

7、e限制的对象或成员函数是普通的对象或普通的成员函数,依称为对象或成员函数。只读对象是关键字const限定的对象。只读成员函数是const置于成员函数右圆括号之后修饰的成员函数,该成员函数不修改成员变量的数据状态,即成员函数体中出现的数据成员仅作为右值。没有只读的构造函数和析构函数,只读对象和对象都调用同一构造函数和析构函数。10const用于名称细分,成员函数声明和定义都必须紧跟const关键字。只读成员函数的声明和定义格式为:(其中type,t1,t2,tn是已经声明的类型)typef(t1v1,t2v2,...,tnvn)const;typeCType::f

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。