当前位置: 首页 > news >正文

C++:从拷贝构造函数到深浅拷贝

拷贝构造函数

当实例化一个新对象并使用同类型对其进行初始化时,会显式调用类的拷贝构造函数,拷贝构造函数写法:形参为const修饰的同类型类引用。拷贝构造函数有个需要注意的点,形参为何是只允许传递引用呢?原因在于若传递的是值,那么在调用拷贝构造函数时形参拷贝到实参时会再次发生拷贝,就会无休止的调用拷贝构造函数。

A(const A& a) { cout << "拷贝构造函数" << endl; }

赋值运算符重载

赋值运算符重载与拷贝构造函数有些相似,同样也是用同类型的对象初始化本对象。区别在于若对象已经存在,无需重新实例化时,赋值运算符操作则会调用重载函数。赋值运算符重载函数一般写成返回值为类的引用,形参为const修饰的类引用。

A& operator=(const A& a) {cout << "重载赋值运算符" << endl;return *this;
}

若没有手动实现这两个函数,在发生拷贝构造或赋值运算时,程序会调用按照位拷贝的方式生成默认函数并调用。位拷贝的方式为“浅拷贝”。若类中没有申请的内存,这种拷贝方式是安全的,但是若类中成员变量存在申请的内存char* buf = new char[1024],那么这种拷贝方式会造成指针垂挂,可能会出现二次析构等不安全的情况。这种时候就需要手动使用深拷贝的方式实现赋值函数与拷贝构造函数。

浅拷贝

浅拷贝的意思是使用指针指向同一个内存空间,类似于C++中的引用。

A* a = new A;
A* b = nullptr;
b = a;

这种方式的效果是两个指针的解引用值是一样的,不管修改哪一个,另外一个输出出来都是一样的,因为他们根本指向的是同一块地址

// 赋值操作
int main()
{int* i = new int(1);int* j;j = i;*i = 5;cout << *i << " - " << *j << endl;delete i;
}
// 拷贝构造
int main()
{int* i = new int(1);int* j = i;*i = 5;cout << *i << " - " << *j << endl;delete j;
}/*****************************************
* 结果为 5 - 5
* /

深拷贝

深拷贝的意思是重新申请一份内存,然后将原内存的数据存入到新内存中,这样两份副本是完全独立的,互不影响的

int main()
{int* i = new int(1);int* j = new int(*i);*i = 5;cout << *i << " - " << *j << endl;delete i;delete j;
}

总结

那么在类中若是存在指针的情况下,尽可能都手动实现赋值函数和拷贝构造函数,并使用深拷贝的方式去实现

class A {
public:A(int i) { Pi = new int(i); }~A() { if (Pi) delete Pi; }A(const A& a) {if (Pi)delete Pi;Pi = new int(*a.Pi);}A& operator=(const A& a) {if (this != &a){if (Pi)delete Pi;Pi = new int(*a.Pi);}return *this;}int* Pi = nullptr;
};int main()
{A a(0);A b = a;A c(0);c = a;*a.Pi = 5;cout << *a.Pi << " - " << *b.Pi << " - " << *c.Pi << endl;
}/* 输出为: 5 - 0 - 0 */

相关文章:

C++:从拷贝构造函数到深浅拷贝

拷贝构造函数 当实例化一个新对象并使用同类型对其进行初始化时&#xff0c;会显式调用类的拷贝构造函数&#xff0c;拷贝构造函数写法&#xff1a;形参为const修饰的同类型类引用。拷贝构造函数有个需要注意的点&#xff0c;形参为何是只允许传递引用呢&#xff1f;原因在于若…...

Openssl之SM2加解密命令

### 1. 生成 SM2 私钥openssl genpkey -algorithm EC \-pkeyopt ec_paramgen_curve:sm2 \-out sm2_private_key.pem### 2. 从私钥导出 SM2 公钥openssl pkey -in sm2_private_key.pem \-pubout \-out sm2_public_key.pem### 3. 使用 SM2 公钥加密openssl pkeyutl -encrypt \-pu…...

Java集合框架之List接口详解

目录 一、List接口概述 二、List接口常见实现类 三、List接口特有方法: 1.元素操作 2. 查找元素位置 3. 子列表与不可变列表 四、List特有迭代器:ListIterator 1.特有的迭代方式 2.ListIterator接口中的常用方法: ⑴.void add(E e):在光标位置插入元素。(会移动…...

oracle apex post接口

日常记录 使用到了apex_json方式接收 、、、1 首先&#xff0c;接口通过body传递过来&#xff0c;成功接收到&#xff0c; 数据格式为 JSON_OBJECT_T l_json : JSON_OBJECT_T.parse(:body); 这里我用参数接收到 然后 里面是包含了 "data" 我用 继续接收到这个 l…...

【数据挖掘】--算法

【数据挖掘】--算法 目录&#xff1a;1. 缺失值和数值属性处理1缺失值处理&#xff1a; 2. 用于文档分类的朴素贝叶斯3. 分治法&#xff1a;建立决策树4. 覆盖算法建立规则5. 挖掘关联规则6. 线性模型有效寻找最近邻暴力搜索&#xff08;Brute-Force Search&#xff09;kd树&am…...

halcon机器视觉深度学习对象检测,物体检测

目录 效果图操作步骤软件版本halcon参考代码本地函数 get_distinct_colors()本地函数 make_neighboring_colors_distinguishable() 效果图 操作步骤 首先要在Deep Learning Tool工具里面把图片打上标注文本&#xff0c; 然后训练模型&#xff0c;导出模型文件 这个是模型 mod…...

英文字体:极简现代浓缩未来派科技海报标题排版无衬线字体 PODIUM Sharp Font

PODIUM Sharp 是 2012 年设计的 DUDU 字体的扩展版本。多年后&#xff0c;我决定通过添加新的母版和粗细来重建和开发这种字体。最后&#xff0c;PODIUM Sharp 由 234 种款式组成&#xff1a;从超压缩发际线到超扩展重度。 这个项目的主要目的是在我在旧波兰标本中发现的不同模…...

Java中JDK、JRE,JVM之间的关系

Java中的JDK、JRE和JVM是三个核心概念&#xff0c;其关系可概括为JDK > JRE > JVM&#xff0c;具体如下&#xff1a; 一、定义与作用 JDK&#xff08;Java Development Kit&#xff09; 定义&#xff1a;Java开发工具包&#xff0c;用于开发和编译Java程序。包含内容&…...

elasticsearch在windows上的配置

写在最前面&#xff1a; 上资源 第一步 解压&#xff1a; 第二步 配置两个环境变量 第三步 如果是其他资源需要将标蓝的文件中的内容加一句 xpack.security.enabled: false 不同版本的yaml文件可能配置不同&#xff0c;末尾加这个 xpack.security.enabled: true打开bin目…...

vscode 配置 Copilot 提示GHE.com连接失败

步骤一&#xff1a;打开设置并进入 settings.json 点击菜单栏中的 “文件” -> “首选项” -> “设置”。 在搜索设置栏中输入 “Copilot: Advanced”。 点击搜索结果下方的 “在 settings.json 中编辑” 链接&#xff0c;这会打开 settings.json 文件。 步骤二&#…...

Pycharm+CodeGPT+Ollama+Deepseek

首先&#xff0c;体验截图&#xff1a; 接着&#xff1a; 1、下载Ollama&#xff1a; Download Ollama on macOS 2、下载模型 以1.5b为例&#xff0c;打开命令行&#xff0c;输入: ollama run deepseek-r1:1.5b 3、Pycharm安装Code GPT插件 打开PyCharm&#xff0c;找到文…...

Unreal5从入门到精通之在编辑器中更新 UserWidgets

前言 在虚幻中创建越来越复杂和灵活的 UserWidget 蓝图时,一个问题是它们在编辑器中的外观与它们在游戏中的最终外观可能有很大不同。 库存面板示例 假设你想创建一个通用的库存显示小部件。我们可以在整个 UI 中使用它,无论我们需要在哪里显示某些内容。 标题,描述所显示…...

C语言修炼手册

目录 第一章 分支与循环语句 1. 悬空else问题 2. 循环输入问题 3. getchar缓冲区溢出问题 4. goto语句坑点 第二章 函数 1.为什么要有库函数 2.函数嵌套 3.链式访问 4.回调函数 5.函数递归 6.字符转换函数 7.模拟实现字符串拷贝strcpy 8.模拟实现字符串的长度s…...

Linux部署ollama

1、下载ollama wget https://github.com/ollama/ollama/releases/download/v0.1.47/ollama-linux-amd64或者curl -fsSL https://ollama.com/install.sh | sh2、安装ollama install ollama-linux-amd64 /usr/local/bin/ollama3、启动ollama vi /etc/systemd/system/ollama.se…...

跨语言语义理解与生成:多语言预训练方法及一致性优化策略

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

最新华为 HCIP-Datacom(H12-821)2025.2.20

最新 HCIP-Datacom&#xff08;H12-821&#xff09;&#xff0c;完整题库请扫描上方二维码访问。 如图所示为某OSPF网络&#xff0c;已知R1和R2已,成功建立邻接关系&#xff0c;现一工程师在R2上配置了图中命令。那么在R2上查看LSDB时&#xff0c;可能存在以下哪些LSA? A&…...

TS语言自定义脚手架

初始化 新建文件夹初始化命令 npm init -ytsc --initnpm i types/nodenpm i typescript# 处理别名npm i -D tsc-alias -y 表示选项都为yes 安装ts相关依赖 新建相关文件 bin 文件夹 src文件夹 commands 文件夹 &#xff08;命令 utils 文件夹 (封装方法&#xff09; index.t…...

深度学习-122-大语言模型LLM之基于langchian自定义国内联网查询工具并创建智能代理

文章目录 1 访问百度1.1 百度检索1.2 库baidusearch2 自定义工具@tool装饰器3 使用工具创建智能代理3.1 语言模型与工具结合3.2 方式一create_react_agent3.3 方式二create_tool_calling_agent3.4 给代理添加记忆4 参考附录1 访问百度 1.1 百度检索 from bs4 import Beautifu…...

Docker Desktop 入门教学

引言 Docker Desktop 是 Docker 官方为开发者提供的桌面应用程序&#xff0c;支持在 Windows 和 macOS 上轻松构建、运行和共享容器化应用程序。它集成了 Docker 引擎、Docker CLI 客户端以及 Docker Compose 等工具&#xff0c;方便您在本地开发和测试。 一、快速安装 1. 系…...

PyCharm 中的 %reset -f 功能:一键重置控制台变量

在 PyCharm 的日常使用中&#xff0c;我们经常需要在控制台中测试和运行各种代码片段。随着时间的推移&#xff0c;控制台中会积累大量的变量和输出&#xff0c;这可能会使得环境变得混乱&#xff0c;影响我们的开发效率。为了解决这个问题&#xff0c;IPython 提供了一个非常有…...

深入解析Merlin:基于Go与HTTP/2的现代C2框架设计与实战

1. 项目概述&#xff1a;一个用Go写的跨平台C2框架如果你在红队或者渗透测试领域摸爬滚打过一阵子&#xff0c;肯定对C2&#xff08;Command & Control&#xff0c;命令与控制&#xff09;框架不陌生。从老牌的Metasploit Meterpreter&#xff0c;到后来火热的Cobalt Strik…...

构建AI驱动的Obsidian智能代理客户端:从原理到实践

1. 项目概述&#xff1a;一个为 Obsidian 设计的 AI 代理客户端如果你和我一样&#xff0c;是 Obsidian 的深度用户&#xff0c;同时又对 AI 自动化抱有极大的热情&#xff0c;那么你很可能已经感受到了一个痛点&#xff1a;我们手头有强大的笔记库&#xff0c;也有能力调用各种…...

自动化测试中的日志和报告

在自动化测试中&#xff0c;生成清晰和详尽的测试报告和日志对于问题排查和结果分析非常关键。以下是一些最佳实践建议&#xff1a; 1. 明确的日志级别&#xff1a;确保你的测试框架可以输出不同级别的日志&#xff0c;如INFO、DEBUG、WARN、ERROR。这样可以帮助你快速定位问题…...

MySQL存储过程执行慢如何排查_优化存储过程性能的实战方法

存储过程性能问题通常源于内部SQL未走索引、循环单行DML、参数类型不匹配等&#xff1b;应查慢查询日志定位CALL语句&#xff0c;对关键SQL逐条EXPLAIN分析&#xff0c;避免隐式转换&#xff0c;优先用批量操作替代循环。查慢查询日志确认是不是存储过程本身慢很多情况下你以为…...

如何将phonedata集成到你的Go项目中:实战教程

如何将phonedata集成到你的Go项目中&#xff1a;实战教程 【免费下载链接】phonedata 手机号码归属地信息库、手机号归属地查询 phone.dat 最后更新&#xff1a;2023年02月 项目地址: https://gitcode.com/gh_mirrors/ph/phonedata phonedata是一个高效的手机号码归属地…...

keysight N9040B是德 UXA 频谱分析仪 2 Hz 至 50 GHz

N9040B UXA信号分析仪的性能让您能够表征当今*挑战性的信号&#xff0c;包括5G、802 .11ax /ay、电子战等应用中的快速跳频、宽带和瞬态信号。通过优异的相位噪声性能和宽广的无杂散动态范围&#xff0c;您可以全面了解您的设计纯度。 Keysight N9040B UXA信号分析仪 主要特性和…...

基于RAG与本地化部署的智能文献助手Aeiva:从原理到实践

1. 项目概述&#xff1a;当AI遇上科研&#xff0c;Aeiva如何重塑文献阅读与知识管理如果你是一名科研工作者、研究生&#xff0c;或者任何需要深度阅读大量文献的从业者&#xff0c;那么你肯定对“文献焦虑”深有体会。面对海量的PDF论文&#xff0c;从筛选、阅读、整理到提炼核…...

ESP32-CAM通过TCP传图,如何解决常见的网络中断和图片乱码问题?

ESP32-CAM TCP图像传输实战&#xff1a;破解网络中断与数据乱码的工程级方案 当你兴奋地完成ESP32-CAM的基础TCP图像传输demo后&#xff0c;现实往往给你当头一棒——WiFi信号波动导致频繁断连、接收到的图片出现诡异马赛克、服务端解析时内存溢出...这些才是真实开发中的常态。…...

AAAI 2026 AMD论文Spark方法揭秘:查询感知的 KV 缓存通道剪枝

AAAI 2026 AMD论文Spark方法揭秘&#xff1a;查询感知的 KV 缓存通道剪枝 原文作者&#xff1a;Huanxuan Liao, Yixing Xu, Shizhu He, Guanchen Li, Xuanwu Yin, Dong Li, Emad Barsoum, Jun Zhao, Kang Liu 在这篇博客中&#xff0c;我们将讨论SparK &#xff0c;一种无需训练…...

Pwnagotchi社区贡献指南:如何参与项目开发与维护

Pwnagotchi社区贡献指南&#xff1a;如何参与项目开发与维护 【免费下载链接】pwnagotchi-bookworm (⌐■_■) - Raspberry Pi instrumenting Bettercap for Wi-Fi pwning. 项目地址: https://gitcode.com/gh_mirrors/pw/pwnagotchi-bookworm Pwnagotchi是一款基于Raspb…...