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

C++中使用复制构造函数确保深复制

C++中使用复制构造函数确保深复制

复制构造函数是一个重载的构造函数,由编写类的程序员提供。每当对象被复制时,编译器都将调用复制构造函数。
为 MyString 类声明复制构造函数的语法如下:

class MyString
{MyString(const MyString& copySource); // copy constructor
};MyString::MyString(const MyString& copySource)
{// Copy constructor implementation code
}

复制构造函数接受一个以引用方式传入的当前类的对象作为参数。这个参数是源对象的别名,您使用它来编写自定义的复制代码,确保对所有缓冲区进行深复制,如以下示例程序所示:

#include <iostream>
#include <string.h>
using namespace std;class MyString
{
private:char* buffer;public:MyString() {}MyString(const char* initString) // constructor{buffer = NULL;cout << "Default constructor: creating new MyString" << endl;if(initString != NULL){buffer = new char [strlen(initString) + 1];strcpy(buffer, initString);cout << "buffer points to: 0x" << hex;cout << (unsigned int*)buffer << endl;}}MyString(const MyString& copySource) // Copy constructor{buffer = NULL;cout << "Copy constructor: copying from MyString" << endl;if(copySource.buffer != NULL){// allocate own buffer buffer = new char [strlen(copySource.buffer) + 1];// deep copy from the source into local bufferstrcpy(buffer, copySource.buffer);cout << "buffer points to: 0x" << hex;cout << (unsigned int*)buffer << endl;}}MyString operator+ (const MyString& addThis) {MyString newString;if (addThis.buffer != NULL){newString.buffer = new char[GetLength() + strlen(addThis.buffer) + 1];strcpy(newString.buffer, buffer);strcat(newString.buffer, addThis.buffer);}return newString;}// Destructor~MyString(){cout << "Invoking destructor, clearing up" << endl;delete [] buffer;}int GetLength() { return strlen(buffer); }const char* GetString(){ return buffer; }
};void UseMyString(MyString str)
{cout << "String buffer in MyString is " << str.GetLength();cout << " characters long" << endl;cout << "buffer contains: " << str.GetString() << endl;return;
}int main()
{MyString sayHello("Hello from String Class");UseMyString(sayHello);return 0;
}

输出:

Default constructor: creating new MyString
buffer points to: 0x01232D90
Copy constructor: copying from MyString
buffer points to: 0x01232DD8
String buffer in MyString is 17 characters long
buffer contains: Hello from String Class
Invoking destructor, clearing up
Invoking destructor, clearing up

分析:

大多数代码都与程序清单 9.8 类似,只是新增了一个复制构造函数(第 23~38 行)。首先,将重点放在 main( )上,它与以前一样创建了对象 sayHello,如第 65 行所示。创建 sayHello 导致了第 1 行输出,这是由 MyString 的构造函数的第 12 行生成的。出于方便考虑,这个构造函数还显示了 buffer 指向的内存地址。接下来, main( )将 sayHello 按值传递个函数 UseMyString( ),如第 66 行所示,这将自动调用复制构造函数,输出指出了这一点。复制构造函数的代码与构造函数很像,基本思想也相同:检查 copySource.buffer 包含的 C 风格字符串的长度(第 30 行),分配相应数量的内存并将返回的指针赋给 buffer,再使用 strcpy 将 copySource.buffer 的内容复制到 buffer(第 33 行)。这里并非浅复制(复制指针的值),而是深复制,即将指向的内容复制到给当前对象新分配的缓冲区中。

程序的输出表明,拷贝中的 buffer 指向的内存地址不同,即两个对象并未指向同一个动态分配的内存地址。因此,函数 UseMyString( )返回、形参 str 被销毁时,析构函数对复制构造函数分配的内存地址调用 delete[], 而没有影响 main( )中 sayHello 指向的内存。 因此, 这两个函数都执行完毕时,成功地销毁了各自的对象,没有导致应用程序崩溃。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院的C++服务器开发课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容
点击立即学习:C/C++后台高级服务器课程

相关文章:

C++中使用复制构造函数确保深复制

C中使用复制构造函数确保深复制 复制构造函数是一个重载的构造函数&#xff0c;由编写类的程序员提供。每当对象被复制时&#xff0c;编译器都将调用复制构造函数。 为 MyString 类声明复制构造函数的语法如下&#xff1a; class MyString {MyString(const MyString& cop…...

【Mysql】Mysql中表连接的原理

连接简介 在实际工作中&#xff0c;我们需要查询的数据很可能不是放在一张表中&#xff0c;而是需要同时从多张表中获取。下面我们以简单的两张表为例来进行说明。 连接的本质 为方便测试说明&#xff0c;&#xff0c;先创建两个简单的表并给它们填充一点数据&#xff1a; …...

Java配置47-Spring Eureka 未授权访问漏洞修复

文章目录 1. 背景2. 方法2.1 Eureka Server 添加安全组件2.2 Eureka Server 添加参数2.3 重启 Eureka Server2.4 Eureka Server 升级版本2.5 Eureka Client 配置2.6 Eureka Server 添加代码2.7 其他问题 1. 背景 项目组使用的 Spring Boot 比较老&#xff0c;是 1.5.4.RELEASE…...

6.Spark共享变量

概述 共享变量 共享变量的工作原理Broadcast VariableAccumulator 共享变量 共享变量的工作原理 通常&#xff0c;当给 Spark 操作的函数(如 mpa 或 reduce) 在 Spark 集群上执行时&#xff0c;函数中的变量单独的拷贝到各个节点上&#xff0c;函数执行时&#xff0c;使用…...

FaceChain开源虚拟试衣功能,打造更便捷高效的试衣新体验

简介 虚拟试衣这个话题由来已久&#xff0c;电商行业兴起后&#xff0c;就有相关的研发讨论。由其所见即所得的属性&#xff0c;它可以进一步提升用户服装购买体验。它既可以为商家做商品展示服务&#xff0c;也可以为买家做上身体验服务&#xff0c;这让同时具备了 B 和 C 的两…...

java的几种对象: PO,VO,DAO,BO,POJO

概述 对象释意使用备注PO&#xff08;persistant object&#xff09;持久对象可以看成是与数据库中的表相映射的Java对象&#xff0c;最简单的PO就是对应数据库中某个表中的一条记录。PO中应该不包含任何对数据库的操作VO&#xff08;view object&#xff09;表现层对象主要对…...

【使用Python编写游戏辅助工具】第三篇:鼠标连击器的实现

前言 这里是【使用Python编写游戏辅助工具】的第三篇&#xff1a;鼠标连击器的实现。本文主要介绍使用Python来实现鼠标连击功能。 鼠标连击是指在很短的时间内多次点击鼠标按钮&#xff0c;通常是鼠标左键。当触发鼠标连击时&#xff0c;鼠标按钮会迅速按下和释放多次&#xf…...

C++二分查找算法的应用:最小好进制

本文涉及的基础知识点 二分查找 题目 以字符串的形式给出 n , 以字符串的形式返回 n 的最小 好进制 。 如果 n 的 k(k>2) 进制数的所有数位全为1&#xff0c;则称 k(k>2) 是 n 的一个 好进制 。 示例 1&#xff1a; 输入&#xff1a;n “13” 输出&#xff1a;“3” …...

2022年12月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 列表L1中全是整数&#xff0c;小明想将其中所有奇数都增加1&#xff0c;偶数不变&#xff0c;于是编写了如下图所示的代…...

行业安卓主板-基于RK3568/3288/3588的AI视觉秤/云相框/点餐机/明厨亮灶行业解决方案(一)

AI视觉秤 单屏Al秤集成独立NPU&#xff0c;可达0.8Tops算力&#xff0c;令AI运算效率大幅提升&#xff0c;以实现生鲜商品快速准确识别&#xff0c;快速称重打印标签&#xff0c;降低生鲜门店运营成本&#xff0c;缓解高峰期称重排队拥堵的现象&#xff0c;提高称重效率&#…...

fo-dicom缺少DicomJpegLsLosslessCodec

VS2019&#xff0c;fo-dicom v4.0.8 using Dicom.Imaging.Codec; ... DicomJpegLsLosslessCodec //CS0103 当前上下文中不存在名称“DicomJpegLsLosslessCodec” 但官方文档的确存在该类的说明DicomJpegLsLosslessCodec 尝试&#xff1a;安装包fo-dicom.Codecs&#xff0c;注…...

跳跳狗小游戏

欢迎来到程序小院 跳跳狗 玩法&#xff1a;一直弹跳的狗狗&#xff0c;鼠标点击屏幕左右方向键进行弹跳&#xff0c;弹到不同物品会有不同的分数减扣&#xff0c;规定的时间3分钟内完成狗狗弹跳&#xff0c;快去跳跳狗吧^^。开始游戏https://www.ormcc.com/play/gameStart/198…...

CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境

CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境 文章目录 CoDeSys系列-4、基于Ubuntu的codesys运行时扩展包搭建Profinet主从环境一、前言二、资料收集三、Ubuntu18.04从安装到更换实时内核1、下载安装Ubuntu18.042、下载安装实时内核&#xff0c;解决编…...

shell_70.Linux调整谦让度

调整谦让度 1.nice 命令 (1)nice 命令允许在启动命令时设置其调度优先级。要想让命令以更低的优先级运行&#xff0c;只需用nice 命令的-n 选项指定新的优先级即可&#xff1a; $ nice -n 10 ./jobcontrol.sh > jobcontrol.out & [2] 16462 $ $ ps -p 16462 -o pid,…...

【jvm】虚拟机栈

目录 一、背景二、栈与堆三、声明周期四、作用五、特点&#xff08;优点&#xff09;六、可能出现的异常七、设置栈内存大小八、栈的存储单位九、栈运行原理十、栈帧的内部结构10.1 说明10.2 局部变量表10.3 操作数栈10.4 动态链接10.5 方法返回地址10.6 一些附加信息 十一、代…...

Flink SQL Over 聚合详解

Over 聚合定义&#xff08;⽀持 Batch\Streaming&#xff09;&#xff1a;**特殊的滑动窗⼝聚合函数&#xff0c;拿 Over 聚合 与 窗⼝聚合 做对⽐。 窗⼝聚合&#xff1a;不在 group by 中的字段&#xff0c;不能直接在 select 中拿到 Over 聚合&#xff1a;能够保留原始字段…...

【鸿蒙软件开发】ArkUI之容器组件Counter(计数器组件)、Flex(弹性布局)

文章目录 前言一、Counter1.1 子组件1.2 接口1.3 属性1.4 事件 1.5 示例代码二、Flex弹性布局到底是什么意思&#xff1f; 2.1 权限列表2.2 子组件2.3 接口参数 2.4 示例代码示例代码1示例代码2 总结 前言 Counter容器组件&#xff1a;计数器组件&#xff0c;提供相应的增加或…...

PyTorch入门学习(十一):神经网络-线性层及其他层介绍

目录 一、简介 二、PyTorch 中的线性层 三、示例&#xff1a;使用线性层构建神经网络 四、常见的其他层 一、简介 神经网络是由多个层组成的&#xff0c;每一层都包含了一组权重和一个激活函数。每层的作用是将输入数据进行变换&#xff0c;从而最终生成输出。线性层是神经…...

农业水土环境与面源污染建模及对农业措施响应

目录 ​专题一 农业水土环境建模概述 专题二 ArcGIS入门 专题三 农业水土环境建模流程 专题四 DEM数据制备流程 专题五 土地利用数据制备流程 专题六 土壤数据制备流程 专题七 气象数据制备流程 专题八 农业措施数据制备流程 专题九 参数率定与结果验证 专题十 模型结…...

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测(多指标、多图)

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&#xff08;多指标、多图&#xff09; 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&#xff08;多指标、多图&#xff09;效果一览基本介绍程序设计参考资料 效果一览…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例&#xff0c;其中使用的是 Module Federation 和 npx-build-plus 实现了主应用&#xff08;Shell&#xff09;与子应用&#xff08;Remote&#xff09;的集成。 &#x1f6e0;️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...