Python3 浅层气浮复制和深层复制有什么区别

关于深度复制的详细介绍-C#.Net教程-PHP中文网QQ群微信公众号还没有收藏关于深度复制的详细介绍下面小编就为大家带来一篇C#复制和深度复制的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧深度复制与浅表复制的区别在于,浅表复制只复制值类型的值,而对于实例所包含的对象依然指向原有实例。 class Program
[Serializable]
public class Car
public Car(st1. 简介:下面小编就为大家带来一篇C#复制和深度复制的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2. 简介:下面小编就为大家带来一篇C# 使用反射来实现对象的深度复制方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧3. 简介:对于javascript来说,数组是一种引用类型,如果只是一维数组的话,复制还较为容易,如果是多维数组呢?如何实现多维数组的深度复制?4. 简介:JavaScript 数组的深度复制解析5. 简介:对于javascript而言,数组是引用类型,如果要想复制一个数组就要动脑袋想想了,因为包括concat、slice在内的函数,都是浅层复制。也就是说,对于一个二维数组来说,用concat来做复制6. 简介:这篇文章主要介绍了DOM节点深度克隆函数cloneNode()用法,实例分析了cloneNode()函数深度复制的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下7. 简介:本文给大家介绍JavaScript深度复制(deep clone)的实现方法,涉及到js深度复制相关知识,本文介绍的非常详细,特此分享脚本之家平台供大家参考【相关问答推荐】:以上就是关于深度复制的详细介绍的详细内容,更多请关注php中文网其它相关文章!共3篇280点赞收藏分享:.php.cn&猜你喜欢PHP中文网:独家原创,永久免费的在线,php技术学习阵地!
All Rights Reserved | 皖B2-QQ群:关注微信公众号他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)劝说深层含义浅层含义_中华文本库
非常遗憾!在本库中没有找到与&"劝说深层含义浅层含义"&相关的文本下次自动登录
现在的位置:
& 综合 & 正文
深层复制浅层复制,面试题
《程序员面试宝典》第三版,p95-96页邮到面试题,有兴趣的同学可以一起来看看:
#include "stdafx.h"
#include &iostream&
#include &vector&
class Demo
Demo(const char* a)
str = new char[32];
strcpy(str,a);
int _tmain(int argc, _TCHAR* argv[])
Demo d("Hello,World!");
vector&Demo& *p = new vector&Demo&();
p-&push_back(d);
问:这段代码有错误,请找出其中出错的原因。
代码自己定义了一个类,类中有一个变量,有构造函数,析构函数。在主函数中,实例化一个Demo类型的变量d,用Vector存放这个变量d,最后删除vector。执行这段代码之后,程序会出错,无法执行下去。
要明白这个程序,得先了解当执行vector的push_back(d)函数时,加入到vector中的是原来的d对象呢,还是d对象的副本?
答案是d对象的副本,当vector中添加元素的时候,是将元素值复制到容器里。就是说容器中存放的是原始元素的副本。被复制的原始值与新容器中的元素各不相关,此后,容器内元素值发生变化时,被复制的原值不会受到影响。
既然加入到vector中的对象是副本,那么就涉及到d对象的复制,程序中并没有写复制构造函数,但是类会调用默认的复制构造函数(或者称为合成复制构造函数),默认构造函数只是简单的将对象的每个非static成员,依次复制到正创建的对象。Demo类只有一个成员变量char * str,这是一个指针类型的变量,因此会执行this.str = d.其结果是两个指针共同指向了同一块儿内存区域。(这就是所谓的浅层复制,不清楚的可以看看)
因为当执行时,在销毁vector对象的同时,也会将vector中存储的对象同时销毁掉,d的副本str指向的区域被销毁掉,此时d的str成员就成了悬垂指针。当main执行完毕后,需要将d销毁掉,此时d的str成员是悬垂指针,因此会找不到要销毁的内容,程序就会出错。
这个问题实质上的问题在于,类的深层复制和浅层复制的区别。当有指针类型成员变量的时,应该采取深层复制。当执行复制操作时,保证每个对象都有自己的独立的内存空间。
程序应该修改如下:
#include "stdafx.h"
#include &iostream&
#include &vector&
class Demo
Demo(const char* a)
str = new char[32];
strcpy(str,a);
Demo(const Demo& d)
this-&str = new char[32];
strcpy(str,d.str);
int _tmain(int argc, _TCHAR* argv[])
Demo d("Hello,World!");
vector&Demo& *p = new vector&Demo&();
p-&push_back(d);
通过这道题,我总结了以下几个知识点:
<span style="font-size:16 color:#. 为了管理具有指针成员的类,必须自己定义三个复制控制成员:复制构造函数,复制操作符,析
<span style="font-size:16 color:#. vector中添加元素的时候,是将元素值复制到容器里。就是说容器中存放的是原始元素的副本。被
复制的原始值与新容器中的元素各不相关,此后,容器内元素值发生变化时,被复制的原值不会
受到影响,反之亦然。
<span style="font-size:16 color:#. 当删除vector对象时,会将vector中存储的对象一并删除掉。
【上篇】【下篇】}

我要回帖

更多关于 浅层气浮机 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信