C++:拷贝构造函数
拷贝构造函数的引入
- 用对象来初始化对象
(1)简单变量定义时,可以直接初始化,也可以用另一个同类型变量来初始化。举例说明
(2)用class来定义对象时,可以直接初始化,也可以用另一个对象来初始化。举例说明
testperson xiaohong(nameq, 23, true); //局部变量 分配在栈上xiaohong.printfmy();testperson p1(xiaohong); //方式2:用另一个对象来初始化新定义的对象p1.printfmy();testperson p2 = p1;p2.printfmy();

-
为什么可以
(1)变量的直接初始化,是变量在被分配内存之后直接用初始化值去填充赋值完成初始化
(2)变量用另一个变量来初始化,是给变量分配了内存后执行了一个内存复制操作来完成的初始化
(3)对象的直接初始化,是对象在分配内存之后调用了相应constructor来完成的初始化
(4)对象的用另一个对象来初始化,是对象在分配之后调用了相应的copy constructor来完成初始化 -
拷贝构造函数
(1)拷贝构造函数是构造函数的一种,符合构造函数的一般性规则
(2)拷贝构造函数的引入是为了让对象在初始化时能够像简单变量一样的被直接用=来赋值
(3)拷贝构造函数不需要重载,他的参数列表固定为const classname& xx
(4)拷贝构造函数很合适用初始化列表来实现
//拷贝构造函数
MAN::testperson::testperson(const testperson &pn)
{cout << "copy constructor" << endl;
}
//拷贝构造函数
MAN::testperson::testperson(const testperson &pn) {this->name = pn.name;this->age = pn.age;this->male = pn.male;cout << "copy constructor" << endl;
}
MAN::testperson::testperson(const testperson &pn):name(pn.name),age(pn.age),male(pn.male){cout << "copy constructor" << endl;
}
string nameq = "lili";testperson xiaohong(nameq, 23, true); //局部变量 分配在栈上xiaohong.printfmy();testperson p1(xiaohong); //方式2:用另一个对象来初始化新定义的对象p1.printfmy();testperson p2 = p1; //方式2 本质一样p2.printfmy();

浅拷贝与深拷贝
-
浅拷贝的缺陷
(1)上节讲的只有普通成员变量初始化的拷贝构造函数,就是浅拷贝
(2)如果不显式提供,C++会自动提供一个全部普通成员被浅拷贝的默认copy constructor
(3)浅拷贝在遇到有动态内存分配时就会出问题,举例演示: -
如何解决
(1)不要用默认copy constructor,自己显式提供一个copy constructor,并且在其内部再次分配动态内存
(2)这就叫深拷贝,深的意思就是不止给指针变量本身分配内存一份,也给指针指向的空间再分配内存(如果有需要还要复制内存内的值)一份
(3)一般如果不需要深拷贝,根本就不用显式提供copy constructor,所以提供了的基本都是需要深拷贝的
(4)拷贝构造函数不需要额外的析构函数来对应,用的还是原来的析构函数
MAN::testperson::testperson(const testperson &pn): name(pn.name), age(pn.age), male(pn.male) {pint = new int(*pn.pint);//深拷贝cout << "copy constructor" << endl;
}
string nameq = "lili";testperson xiaohong(nameq, 23, true); //局部变量 分配在栈上testperson p1(xiaohong); //方式2:用另一个对象来初始化新定义的对象*(xiaohong.pint) = 56;xiaohong.printfmy();p1.printfmy();testperson p2 = p1; //方式2 本质一样p2.printfmy();

- 如何深度理解浅拷贝和深拷贝
(1)这个问题不是C++特有的,Java等语言也会遇到,只是语言给封起来了,而C++需要类作者自己精心处理
(2)从编程语言学角度讲,本质上是值语义value symatics和引用语义reference symatics的差别
(3)C学好了有linux内核阅读级别的C功底,理解这些简直太简单了
总结
理解普通变量赋值和对象赋值的区别
理解什么是浅拷贝、深拷贝,怎么实现深拷贝
学习记录,侵权联系删除。
来源:朱老师物联网大课堂
相关文章:
C++:拷贝构造函数
拷贝构造函数的引入 用对象来初始化对象 (1)简单变量定义时,可以直接初始化,也可以用另一个同类型变量来初始化。举例说明 (2)用class来定义对象时,可以直接初始化,也可以用另一个对象来初始化。举例说明 testperson xiaohong(na…...
云服务出现故障这样处理
无法连接云服务器 服务器远程无法连接时,可通过7ECloud控制台进行连接。 常见故障现象 1、ping不通 2、ping丢包 3、部分端口telnet不通 4、全部端口telnet不通 5、广告、弹窗植入 6、域名无法访问IP访问正常 常见故障原因 1、云服务器过期、关机或者EIP被…...
CVPR2024自动驾驶轨迹预测方向的论文整理
2024年自动驾驶轨迹预测方向的论文汇总 1、Producing and Leveraging Online Map Uncertainty in Trajectory Prediction 论文地址:https://arxiv.org/pdf/2403.16439 提出针对在线地图不确定性带给轨迹预测的影响对应的解决方案。 在轨迹预测中,利用在…...
数据结构——队列练习题
在C语言中,.和->运算符用于访问结构体的成员变量。它们之间的区别在于:.运算符用于访问结构体变量的成员。->运算符用于访问结构体指针变量的成员 1a(rear指向队尾元素后一位,判空判满时牺牲一个存储单元) 首先…...
PLL和CDR的内部结构及其区别
比较PLL和CDR的内部结构及其区别: 基本结构: PLL(相位锁定环): 相位检测器环路滤波器压控振荡器(VCO)分频器(可选,用于频率合成) CDR(时钟数据恢复…...
HarmonyOS APP应用开发项目- MCA助手(Day02持续更新中~)
简言: gitee地址:https://gitee.com/whltaoin_admin/money-controller-app.git端云一体化开发在线文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/agc-harmonyos-clouddev-view-0000001700053733-V5注:…...
华为交换机 LACP协议
华为交换机支持的LACP协议,即链路聚合控制协议,是一种基于IEEE 802.3ad标准的动态链路聚合与解聚合的协议。它允许设备根据自身配置自动形成聚合链路并启动聚合链路收发数据。 在LACP模式下,链路聚合组能够自动调整链路聚合,维护…...
node 下载文件到网络共享目录
1、登录网络共享计算器 2、登录进入后复制要存储文件的目录路径 例如: \\WIN-desktop\aa\bb\cc 3、node 下载后写入网络共享目录 注意(重要):在使用UNC路径时,请确保你正确转义了反斜杠(使用两个反斜杠来表示一个&…...
STM32基础知识
一.STM32概述 第一款STM32单片机发布的时间为2007年6月11日。由意法半导体(ST)公司推出,是STM32系列中的首款产品,具体型号为STM32F1,它是一款基于Cortex-M内核的32位微控制器(MCU)。 STM32F1…...
安装docker版rabbitmq 3.12
本文介绍在Ubuntu22中安装docker版rabbitmq 3.12。 一、拉取镜像 docker pull rabbitmq:3.12.14-management二、创建数据目录和docker-compose文件 创建目录: cd /root mkdir rabbitmq-docker cd rabbitmq-docker mkdir data chmod 777 data创建docker-compose配…...
c++重定向输出和输出(竞赛讲解)
1.命令行重定向 在命令行中指定输出文件 指令 .\重定向学习.exe > 1.txt 效果 命令行输入和输出 指令 .\重定向学习.exe < 2.txt > 1.txt 效果 代码 #include<bits/stdc++.h> using namespace std; int n; int main(){cin>>n;for(int i=0;i<n;i…...
实在智能对话钉钉:宜搭+实在Agent,AI时代的工作方式
比起一个需求需要等产品、技术排期,越来越多的人开始追求把自己武装成「全能战士」,通过低代码工具一搭,一个高效的工作平台便产生了。 宜搭是钉钉自研的低代码应用构建平台,无论是专业开发者还是没有代码基础的业务人员…...
MySQL的Docker部署方式
说明:Docker部署MySQL主要是简单快速,不会对电脑系统造成污染。假如你的本地没有Docker,或者你不会使用Docker,则使用PyCharm去启动MySQL,或者直接在本机安装MySQL都是可以的。最重要的是,你要有一个MySQL环境…...
光伏电站数据采集方案(基于工业路由器部署)
一、方案概述 本方案采用星创易联SR500工业路由器作为核心网关设备,实现对光伏电站现场数据的实时采集、安全传输和远程监控。SR500具备多接口、多功能、高可靠性等特点,能够满足光伏电站数据采集的各种需求。(key-iot.com/iotlist/sr500…...
一文让你彻底搞懂什么是CDN
一、引言 在当今互联网时代,网站的加载速度和稳定性是用户体验的关键因素之一。而CDN(Content Delivery Network,内容分发网络)作为提升网站性能的重要技术手段,受到了广泛的关注和应用。本篇博客将深入探讨CDN的工作…...
1023记录
米哈游二面 自动化测试中自动化驱动的能力? pytest的驱动能力: 1,自动发现测试用例:以"test_"开头的Python文件、以"Test"开头的类和以"test_"开头的函数,将它们识别为测试用例 2&…...
【并发编程JUC】AQS详解
定义理解 AQS,全称为AbstractQueuedSynchronizer,是Java并发包(java.util.concurrent)中的一个框架级别的工具类,用于构建锁和同步器。它是许多同步类的基础,如ReentrantLock、Semaphore、CountDownLatch等…...
如何找BMS算法、BMS软件的实习
之前一直忙,好久没有更新了,今天就来写一篇文章来介绍如何找BMS方向的实习,以及需要具备哪些条件,我的实习经历都是在读研阶段找的,读研期间两段的实习经历再加上最高影响因子9.4分的论文,我的秋招可以说是…...
AR视频技术与EasyDSS流媒体视频管理平台:打造沉浸式视频体验
随着增强现实(AR)技术的飞速发展,其在各个领域的应用日益广泛。这项技术通过实时计算摄影机影像的位置及角度,将虚拟信息叠加到真实世界中,为用户带来超越现实的感官体验。AR视频技术不仅极大地丰富了我们的视觉体验&a…...
每天一个数据分析题(三百九十九)- 逻辑回归
逻辑回归中,若选0.5作为阈值区分正负样本,其决策平面是( ) A. wxb= 0 B. wxb= 1 C. wxb= -1 D. wxb= 2 数据分析认证考试介绍:点击进入 题目来源于CDA模拟题库 点…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
