博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于复制
阅读量:6970 次
发布时间:2019-06-27

本文共 1808 字,大约阅读时间需要 6 分钟。

深复制vs.浅复制

  • 浅复制:复制中把成员指针变量当成“指针”处理,赋值后两个指针指向相同的内存
  • 深复制:复制中把指针成员变量当成“值”处理,赋值后指针指向对象副本(即两个指针指向的内存不同,但内存中内容相同)

C++中的复制

C++中的指针具有缺陷,无法保证指针指向的空间可用(C++从入门到段错误~~)当指针作为类成员时,应进行恰当的管理,

  1. 指针成员采取常规指针型行为。这样的类具有指针的所有缺陷但无需特殊的复制控制。
  2. 类可以实现所谓的“智能指针”行为。指针所指向的对象是共享的,但类能够防止悬垂指针。
  3. 类采取值型行为。指针所指向的对象是唯一的,由每个类对象独立管理。

tip

  • 为了管理具有指针成员的类,必须定义三个复制控制成员:复制构造函数、赋值操作符和析构函数。这些成员可以定义指针成员的指针型行为或值型行为,也就是决定了复制的时候是深复制还是浅复制

OC的复制

集合的复制

不可变集合

  • copy:指针复制。cpy_arr == ori_arr
  • mutableCopy:对象复制(单层深复制,对集合中的元素进行指针复制)
  • initWithArray:copyItems:YES
    • 当集合元素可变时,对该元素进行对象复制;否则进行指针复制
    • 返回__NSArrayI *
  • arrayWithArray对集合进行对象复制,对集合内元素进行指针复制

可变集合

  • copy:对象复制cpy_arr != ori_arr
  • mutableCopy:对象复制(单层深复制,对集合中的元素进行指针复制)
  • initWithArray:copyItems:YES当元素为可变时,复制该元素,不可变时,不复制
    • 返回__NSArrayI *
    • 当集合元素可变时,对该元素进行对象复制;否则进行指针复制
  • arrayWithArray对集合进行对象复制,对集合内元素进行指针复制 ###非集合对象 参考集合的复制(毕竟对象的实例变量也有可能是指针),主要考虑对象是否可变

tip

  • 对于二维数组,即便使用initWithArray:copyItems:YES,对于数组的元素,也只是进行指针复制,亦即:
    • arr_cpy != arr
    • arr_cpy[i] != arr[i]
    • arr_cpy[i][j] == arr[i][j]
  • 若想完全实现深复制,可通过NSKeyedArchiverNSKeyedUnarchiver实现

Swift中的复制

  • Swift中的字符串,数组,字典类型作为结构体被实现
  • 当他们被赋值给一个新的常量/变量,或者作为实参被传递给函数或方法是,将被复制
  • Swift内部管理所有的副本确保整体性能得到优化

pyhton中的复制

  • 对对象赋值时,进行指针复制
aList=[[1, 2], 3, 4] b = a#id(b) == id(a)
  • 切片,对所指指定的元素进行指针复制。
aList=[[1, 2], 3, 4]b = aList[:]#id(b) != id(a)#id(b[0]) == id(a[0])
  • copy.copy 只拷贝父对象,不会拷贝对象的内部的子对象。
aList=[[1, 2], 3, 4]b = copy.copy(aList)#id(b) != id(a)#id(b[0]) == id(a[0])
  • copy.deepcopy 拷贝对象及其子对象
aList=[[1, 2], 3, 4]b = copy.copy(aList)#id(b) != id(a)#id(b[0]) != id(a[0])

C#中的复制

MemberwiseClone

  • MemberwiseClone 方法创建一个浅表副本
  • 具体来说就是创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象

实现完全深复制

  • 借助.Net的序列化和反序列化机制,可以十分简单的深度Clone一个对象。
  • 首先将对象序列化到内存流中,此时对象和对象引用的所用对象的状态都被保存到内存中。.Net的序列化机制会自动处理循环引用的情况。
  • 然后将内存流中的状态信息反序列化到一个新的对象中。

转载于:https://www.cnblogs.com/rainySue/p/guan-yu-fu-zhi.html

你可能感兴趣的文章
html五子人机对战游戏代码,HTML5+JS 《五子飞》游戏实现(八)人机对战
查看>>
cfb为什么不需要填充_石墨接地为什么不需要电焊?
查看>>
c++线程中更新ui_大比拼 | 下一代高性能跨平台UI渲染引擎
查看>>
asp.net gridview 为什么只显示一行数据_针对mysql,数据库干货分享,值得收藏
查看>>
反驳生命的起点是rna_关于RNA世界假说的不精确复制是否有利及膜蛋白在其中的作用的假说...
查看>>
r 选取从小到大的数据_收藏|零基础学R之数据结构,一个学习R的理由足够
查看>>
向量图 正弦交流电路_立体几何大题——向量法(二面角)专题
查看>>
处于停机等非正常状态_工地停工,停机很久之后的挖掘机,重启前要检查什么...
查看>>
创建前缀一样的文件_8 个文件整理高级技巧,让你效率倍增
查看>>
mysql 配置程序_4 MySQL程序概述(包含mysql配置文件配置原理)-学习笔记
查看>>
ubuntu jdbc mysql_Ubuntu jsp平台使用JDBC来连接MySQL数据库
查看>>
qt 嵌入cmd窗口_MIL+QT实践教程三
查看>>
mysql的连接路径_Mysql 连接路径 url 参数解析
查看>>
mysql增量备份失败_mysql的增量备份
查看>>
mysql数据库索引页号为什么从3开始_【转载】MySQL索引背后的数据结构及算法原理...
查看>>
mysql的both_MySQL中Global、Session和Both(Global & Session)范围
查看>>
mysql转日期比较_mysql 日期转换 比较
查看>>
python下载图片脚本_Python实现批量下载图片的方法
查看>>
堆排序python理解_python堆排序如何使用呢?
查看>>
5道java面试题_5道常见的Java面试题!值得一看
查看>>