- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(简单点就是:对于指针,深copy时候,相同数据指针指向不同的内存地址
深度拷贝是什么??其实就是针对指针或引用的特殊处理而已。任何面向对象的程序都要解决的问题。?一个对象A里面有一个指针指向一堆数据,你现在想把这个对象拷贝一份B,那么这个指针怎么办?如果默认的话,指针的内容被拷贝,那么拷贝后的对象B和之前的对象A中的指针指向的是同一个数据。这样就是“浅拷贝”。如果B中修改了这些数据,A那边一样会变,因为二者的数据其实是同一个。这在有些时候会出问题。?而“深拷贝”就是,自己处理这些指针,给B重新分配一块内存,然后把指针指向的数据也拷贝一份,这样A和B就完全独立,互相没有影响。 );
浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当 值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象拥有不同的 资源,但资源的内容是一样的。对于堆资源来说,就是在开辟一片堆内存,把原来的内容拷贝。?如果你拷贝的对象中引用了某个外部的内容(比如分配在堆上的数据),那么在拷贝这个对象的时候,让新旧两个对象指向同一个外部的内容,就是浅拷贝;如果在拷贝这个对象的时候为新对象制作了外部对象的独立拷贝,就是深拷贝?引用和指针的语义是相似的,引用是不可改变的指针,指针是可以改变的引用。其实都是实现了引用语义。?深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象,则是深拷贝,否则是浅拷贝。?COW语义是“深拷贝”与“推迟计算”的组合,仍然是深拷贝,而非浅拷贝,因为拷贝之后的两个对象的数据在逻辑上是不相关的,只是内容相同。?无论深浅,都是需要的。当深拷贝发生时,通常表明存在着一个“聚合关系”,而浅拷贝发生时,通常表明存在着一个“相识关系”。?举个简单的例子:?当你实现一个Composite Pattern,你通常都会实现一个深拷贝(如果需要拷贝的话),很少有要求同的Composite共享Leaf的;?而当你实现一个Observer Pattern时,如果你需要拷贝Observer,你大概不会去拷贝Subject,这时就要实现个浅拷贝。?是深拷贝还是浅拷贝,并不是取决于时间效率、空间效率或是语言等等,而是取决于哪一个是逻辑上正确的//--------------------------------------------------------------------------------
在学习这一章内容前我们已经学习过了类的构造函数和析构函数的相关知识,对于普通类型的对象来说,他们之间的复制是很简单的,例如:
?
int a = 10;
int b =a; 自己定义的类的对象同样是对象,谁也不能阻止我们用以下的方式进行复制,例如:
?
#include iostream
usingnamespacestd;
class Test
{
public:
Test( int temp)
{
p1=temp;
}
protected:
int p1;
};
Void main()
{
Test a(99);
Test b=a;
} 普通对象和类对象同为对象,他们之间的特性有相似之处也有不同之处,类对象内部存在成员变量,而普通对象是没有的,当同样的复制方法发生在不同的对象上的 时候,那么系统对他们进行的操作也是不一样的,就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的,在上面的代码中,我们并没有看到 拷贝构造函数,同样完成了复制工作,这又是为什么呢?因为当一个类没有自定义的拷贝构造函数的时候系统会自动提供一个默认的拷贝构造函数,来完成复制工 作。
下面,我们为了说明情况,就普通情况而言(以上面的代码为例),我们来自己定义一个与系统默认拷贝构造函数一样的拷贝构造函数,看看它的内部是如何工作的!
代码如下:
?
#include iostream
usingnamespacestd;
classTest
{
public:
Test(inttemp)
{
p1=temp;
}
Test(Test c_t)//这里就是自定义的拷贝构造函数
{
cout进入copy构造函数p1=c_t.p1;//这句如果去掉就不能完成复制工作了,此句复制过程的核心语句
}
public:
intp1;
};
voidmain()
{
Test a(99);
Test b=a;
coutcin.get();
} 上面代码中的T
您可能关注的文档
最近下载
- 3.1数据编码教学设计.docx VIP
- 2025黑龙江建筑职业技术学院单招《数学》常考点试卷含答案详解(完整版).docx VIP
- 高考语文复习古代诗歌阅读边塞征戍类专题练习合集.docx VIP
- 一种JNK激酶的相变探针及其应用.pdf VIP
- (高清版)DB37∕T 1830-2011 文登奶山羊饲养管理技术规程.pdf VIP
- 一方出地一方出资金的投资合作协议模板.docx VIP
- 第二单元 第1课《吉祥剪纸》课件【桂美版】美术 七年级上册.pptx VIP
- Joyoung 九阳 开水煲 K17D-WY170使用说明书.pdf
- 2025年认证行业法律法规及认证基础知识试题(附答案).docx VIP
- 2024年高考语文复习:古代诗歌边塞征戍类对比阅读练习题汇编(含答案解析).docx VIP
文档评论(0)