返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中深复制和浅复制是什么
  • 611
分享到

C++中深复制和浅复制是什么

2023-06-29 11:06:16 611人浏览 八月长安
摘要

这篇文章主要为大家展示了“c++中深复制和浅复制是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中深复制和浅复制是什么”这篇文章吧。1、什么是浅复制在C++中深复制和浅复制最大的区别在

这篇文章主要为大家展示了“c++中深复制和浅复制是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中深复制和浅复制是什么”这篇文章吧。

1、什么是浅复制

在C++中深复制和浅复制最大的区别在“类包含指针类型的数据成员”时。由于默认的复制构造函数完成的是对象成员的数值复制,当原对象含有指针P指向地址xxx时,通过原对象复制得到的新对象的指针P同样指向地址xxx,造成同一个地址xxx被两个对象同时指向,这是非常不安全的,因为任一对象对地址xxx的操作很可能会对另一个对象造成不良影响。下面定义的Duck类就包含指针成员foot,该成员指向数组的首地址:

class Duck {public:    Duck() { foot = new int[2](); }    int *foot;};

首先定义一个duck对象,然后通过duck复制得到anotherDuck,那么二者的指针成员foot指向相同的地址。anotherDuck对指针成员foot指向的内存进行操作,和duck的指针成员foot对指向的内存进行操作是等价的,因为两个对象的foot指针都指向相同的地址,这就是不安全的来源:

Duck duck;Duck anotherDuck = duck;/// anotherDuck对foot指向内存进行赋值anotherDuck.foot[1] = 666;

此外,为了证明原对象和新对象的foot指针都指向相同的地址,可以查看一下:

printf("their id is %p and %p \n", duck.foot, anotherDuck.foot);/// 得到的结果证明二者确实指向相同的地址their id is 005B0CE8 and 005B0CE8

总之,上面的现象就是浅复制,这种浅复制很可能带来不安全因素,这种不安全同样体现在内存释放时(同一个内存不能释放两次),所以需要使用下面将要介绍的深复制。

2、如何实现深复制

按照掌握的资料,深复制需要编写赋值构造函数,创建成员指针所指向内存的新副本。比如上一节定义的Duck类指针成员foot,复制构造函数需要创建foot指向的内存的新副本:

Duck(Duck &duck) {    /// 1、创建新的内存空间    foot = new int[2]();    /// 2、将原对象的指针所指向的数组数值    /// 全部复制到新对象指针指向的数组    for (int i = 0; i < 2; i++) {        foot[i] = duck.foot[i];    }}

其中第1步目的是创建新的内存空间,让新对象的指针成员指向新的内存,而不是和原对象指向相同的内存,同时必须保证新的内存所存储的类型和原对象相同,都是int类型的2个元素的数组。第2步的目的是将原对象指针所指向的数组的值,全部复制到新对象指所针指向的数组中。经过上面的两个步骤,深度复制完成。

为了确保原对象duck和新对象anotherDuck的foot指针所指向的地址不同,可以进行下面的测试,输出两个foot指向的地址:

printf("their id is %p and %p \n", duck.foot, anotherDuck.foot);/// 结果显示两个foot指向的地址是不同的their id is 01250FA0 and 01250B40

以上是“C++中深复制和浅复制是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网其他教程频道!

--结束END--

本文标题: C++中深复制和浅复制是什么

本文链接: https://lsjlt.com/news/324459.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++中深复制和浅复制是什么
    这篇文章主要为大家展示了“C++中深复制和浅复制是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C++中深复制和浅复制是什么”这篇文章吧。1、什么是浅复制在C++中深复制和浅复制最大的区别在...
    99+
    2023-06-29
  • C++深复制和浅复制讲解
    目录前言:1、什么是浅复制2、如何实现深复制前言: 深复制和浅复制在python中同样存在,但是由于python中没有指针这个概念,所以当时学python时理解这个问题非常困难。实际...
    99+
    2024-04-02
  • python中的深复制和浅复制是什么意思
    本篇内容介绍了“python中的深复制和浅复制是什么意思”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!0、定义:    ...
    99+
    2023-06-04
  • JavaScript数组中的深复制与浅复制是什么
    本篇内容介绍了“JavaScript数组中的深复制与浅复制是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所...
    99+
    2024-04-02
  • JavaScript赋值,浅复制和深复制的区别是什么
    本篇内容介绍了“JavaScript赋值,浅复制和深复制的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、变量赋值不知道会不会有...
    99+
    2023-06-30
  • 深入浅析Java中对象的深复制与浅复制
    本篇文章为大家展示了深入浅析Java中对象的深复制与浅复制,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 Java对象深复制与浅复制实例详解我们在遇到一些业务场景的时候经常需要对对象进行复...
    99+
    2023-05-31
    java 对象 中对
  • JavaScript 赋值,浅复制和深复制的区别
    目录一、变量赋值1.1 原始值和引用值1.2 赋值二、浅复制(Shallow Copy)2.1 原生 JavaScript 中的浅复制Object.assign()2.2 浅复制的手...
    99+
    2024-04-02
  • Java 浅复制和深复制的实例详解
    Java 浅复制和深复制的实例详解1 浅复制和深复制区别浅复制:浅复制只是复制本对象的原始数据类型,如int、float、String,对于数组和对象引用等是不会复制的。因此浅复制是有风险的。深复制:不但对原始数据类型进行复制,对于对象中的...
    99+
    2023-05-31
    java 浅复制 深复制
  • js中如何复制一个数组(浅复制、深复制)
    目录下面介绍数组的浅复制方法一:concat()方法二:slice()方法三:扩展运算符方法四: Object.assign()下面是深复制方法一:JSON.parse(J...
    99+
    2023-05-15
    js复制数组 js浅复制 js深复制
  • python变量及浅复制与深复制
    一、变量及定义:     变量定义:一段存放在内存特定区域的空间,在python中变量名没有类型,引用的对象有类型之分;     命名规则:字母或下划线开头,不能以数字开头。     特殊变量:以单下划线(_)开头的变量 不能被 from ...
    99+
    2023-01-31
    变量 python
  • Java中对象的深复制和浅复制的详细介绍
    这篇文章主要介绍“Java中对象的深复制和浅复制的详细介绍”,在日常操作中,相信很多人在Java中对象的深复制和浅复制的详细介绍问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中对象的深复制和浅复制的详...
    99+
    2023-06-17
  • Python中的赋值与浅复制与深复制之间
    #赋值与浅复制一层列表 """a = [1, 2]    b = a   #赋值c = a.copy() #浅复制a.append(3)     print(b)  #父对象改变print(c)  #父对象不变'''[1, 2, 3][1...
    99+
    2023-01-30
    赋值 Python
  • python3-列表的深浅复制
    # Auther: Aaron Fannames = ["aaron", "alex", "james", "meihengfan"]#复制一份列表#浅复制 (注意,这只是一个浅复制,只能复制第一层列表里面的东西,如果列表里面还有一层列表,...
    99+
    2023-01-31
    深浅 列表
  • JS的深浅复制详细
    目录1、浅复制的意思2、深复制的意思3、使用深复制的原由4、可实现深复制的几种方法实现方式一:JSON的序列化与反序列化实现方式二:Object.assign()实现方式三:扩展运算...
    99+
    2024-04-02
  • JS对象复制(深拷贝和浅拷贝)
    目录一、浅拷贝1、Object.assign(target,source,source...)2、扩展运算符(spread)二、深拷贝1、使用对象序列化 JSON.stringify...
    99+
    2024-04-02
  • vue的深复制是什么意思
    这篇文章主要讲解了“vue的深复制是什么意思”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue的深复制是什么意思”吧!Object.assign() 方法...
    99+
    2024-04-02
  • Java中的“浅复制”与“深复制”的区别与实现(附代码)
    将一个对象的引用复制给另一个对象,一共有三种方式。第一种方式是直接赋值,第二种方式是浅复制,第三种方式是深复制。1.直接赋值在Java中,A a1 = a2,这实际上复制的是引用,也就是说 a1 和 a2指向的是同一个对象。因此,当a1变化...
    99+
    2016-02-27
    java基础 java 深复制 浅复制
  • 深入浅析Android中的ListView复用机制
    这篇文章给大家介绍深入浅析Android中的ListView复用机制,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.ListView的复用机制  ListView是我们经常使用的一个控件,虽然说都会用,但是...
    99+
    2023-05-31
    android listview roi
  • MySQL并行复制的深入浅出
    一、并行复制的背景 首先,为什么会有并行复制这个概念呢? 1.DBA都应该知道,MySQL的复制是基于binlog的。 2.MySQL复制包括两部分,IO线程 和 SQL线程...
    99+
    2022-05-24
    MySQL MySQL
  • PHP数组的复制策略:深度复制与浅复制,解析与性能对比
    在 php 中,数组复制有两种策略:深度复制和浅复制。深度复制创建源数组的独立副本,对其中一个数组的更改不会影响另一个数组。浅复制仅复制数组的引用,对其中一个数组的更改会反映在另一个数组...
    99+
    2024-05-02
    深度复制 浅复制
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作