【C++入门】—— 【什么时候需要用到深拷贝】C++的类中何时需要用到深拷贝?保姆级别带你罗列所有可能!

⚡ CYBER_PROFILE ⚡
/// SYSTEM READY ///


WARNING \]: DETECTING HIGH ENERGY **🌊 🌉 🌊 心手合一 · 水到渠成** ![分隔符](https://i-blog.csdnimg.cn/direct/60a3de2294e9439abad47378e657b337.gif) |------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| | **\>\>\> ACCESS TERMINAL \<\<\<** || | [**\[ 🦾 作者主页 \]**](https://blog.csdn.net/fengtinghuqu520?spm=1000.2115.3001.5343) | [**\[ 🔥 C语言核心 \]**](https://blog.csdn.net/fengtinghuqu520/category_12955956.html) | | [**\[ 💾 编程百度 \]**](https://blog.csdn.net/fengtinghuqu520/category_13083835.html) | [**\[ 📡 代码仓库 \]**](https://blog.csdn.net/fengtinghuqu520/article/details/147275999?spm=1001.2014.3001.5502) | --------------------------------------- Running Process: 100% \| Latency: 0ms *** ** * ** *** #### 索引与导读 * [一、什么是深拷贝](#一、什么是深拷贝) * [二、什么时候需要"深拷贝"?](#二、什么时候需要“深拷贝”?) * * [1)情况 A:不需要显式实现 (如 Date)](#1)情况 A:不需要显式实现 (如 Date)) * [2)情况 B:必须显式实现 (如 Stack)------深拷贝](#2)情况 B:必须显式实现 (如 Stack)——深拷贝) * [3)情况 C:不需要显式实现 (如 MyQueue)](#3)情况 C:不需要显式实现 (如 MyQueue)) * [💻结尾--- 核心连接协议](#💻结尾— 核心连接协议) ## 一、什么是深拷贝 **深拷贝**是指在复制一个对象时,不仅复制对象本身,还会递归地复制其引用的所有子对象 🚩**在内存中开辟一块全新的空间,将原对象的所有层级完整地克隆一份。副本与原件完全解耦,互不影响** 基本类型 (Number, String, etc.) null 引用类型 (Object, Array) 是 否 否 是 开始拷贝 判断数据类型 直接返回该值 直接返回 null 是否已拷贝过? 循环引用检查 返回已缓存的引用 创建新对象/数组容器 记录到已拷贝映射表 遍历原对象属性 递归调用深拷贝函数 将结果赋值给新容器 属性遍历完? 返回新容器 结束 *** ** * ** *** ## 二、什么时候需要"深拷贝"? 通过`Date`、`Stack`和`MyQueue`做了对比: ### 1)情况 A:不需要显式实现 (如 Date) 成员全是内置类型,且没有指向外部资源。默认的浅拷贝就够了 * **Date** ```cpp class Date { public: Date(int year = 2026, int month = 1, int day = 1) : _year(year), _month(month), _day(day) {} // 不需要写赋值运算符,默认拷贝即可满足 private: int _year; int _month; int _day; }; ``` *** ** * ** *** ### 2)情况 B:必须显式实现 (如 Stack)------深拷贝 如果类中涉及堆区内存申请(如 `new`、`malloc`),默认的浅拷贝会导致两个对象指向同一块内存,引发二次析构和内存泄漏。 * **Stack** ```cpp class Stack { public: Stack(int capacity = 4) { _a = new int[capacity]; // 涉及堆内存申请 _size = 0; _capacity = capacity; } // 赋值运算符重载(深拷贝实现) Stack& operator=(const Stack& st) { if (this != &st) { // 1. 释放原有资源 delete[] _a; // 2. 开辟新空间 _a = new int[st._capacity]; // 3. 拷贝数据 memcpy(_a, st._a, sizeof(int) * st._size); _size = st._size; _capacity = st._capacity; } return *this; } ~Stack() { delete[] _a; // 析构函数释放内存 } private: int* _a; int _size; int _capacity; }; ``` *** ** * ** *** ### 3)情况 C:不需要显式实现 (如 MyQueue) 如果 `MyQueue` 内部成员是 `Stack`,虽然 `Stack` 需要深拷贝,但 `MyQueue` 会自动调用 `Stack` 的赋值运算符,所以 `MyQueue` 反而不需要自己写 * **MyQueue** ```cpp class MyQueue { public: // 虽然 Stack 需要深拷贝,但 MyQueue 会自动调用 Stack 的赋值运算符 // 因此 MyQueue 反而不需要显式写深拷贝函数 private: Stack _pushst; Stack _popst; }; ``` *** ** * ** *** ## 💻结尾--- 核心连接协议 **警告:** 🌠🌠正在接入底层技术矩阵。如果你已成功破解学习中的逻辑断层,请执行以下指令序列以同步数据:🌠🌠 *** ** * ** *** **【📡】 建立深度链接:** **关注**本终端。在赛博丛林中深耕底层架构,从原始代码到进阶协议,同步见证每一次系统升级。 **【⚡】 能量过载分发:** 执行**点赞**操作。通过高带宽分发,让优质模组在信息流中高亮显示,赋予知识跨维度的传播力。 **【💾】 离线缓存核心:** 将本页加入**收藏**。把这些高频实战逻辑存入你的离线存储器,在遭遇系统崩溃或需要离线检索时,实现瞬时读取。 **【💬】 协议加密解密:** 在**评论区**留下你的散列码。分享你曾遭遇的代码冲突或系统漏洞(那些年踩过的坑),通过交互式编译共同绕过技术陷阱。 **【🛰️】 信号频率投票:** 通过**投票**发射你的选择。你的每一次点击都在重新定义矩阵的进化方向,决定下一个被全量拆解的技术节点。 *** ** * ** *** ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57b03915c54b43a7a03fa92dbbfe57c3.gif) ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/0905dc972de8414bb602715de3f866ee.gif)

相关推荐
HL_风神2 小时前
C++设计模式学习-工厂方法模式
c++·学习·设计模式
我是一只小小鱼~2 小时前
JAVA 使用spring boot 搭建WebAPI项目
java·数据库·spring boot
明洞日记2 小时前
【软考每日一练026】软件工程深度解析:软件开发方法学的分类与应用实战
c++·ai·系统架构·软件工程·软考
小信丶2 小时前
@EnableMethodCache 注解详解:原理、应用场景与示例代码
java·spring boot·后端·spring
坊钰2 小时前
【Rabbit MQ】Rabbit MQ 的结构详解,传输机制!!!
java·rabbitmq
Psycho_MrZhang2 小时前
Claude高质量产出
java·服务器·网络
明洞日记2 小时前
【软考每日一练028】软件工程考点:螺旋模型与构件组装模型深度解析
c++·ai·系统架构·软件工程·软考·开发模型
.小墨迹2 小时前
开源的自动驾驶框架
c++·人工智能·学习·算法·ubuntu·开源·自动驾驶