C++系列-浅拷贝和深拷贝

news2024/9/28 7:28:52

浅拷贝和深拷贝

  • 浅拷贝
  • 深拷贝

如果属性有在堆区开辟内存的,一定要自己提供拷贝构造函数,进行深拷贝,以免堆区内存重复释放。

浅拷贝

  • 浅拷贝会带来的问题是堆区空间重复释放

在这里插入图片描述

因为是浅拷贝,在调用第二个对象的析构函数时,会报错
code:
	#include<iostream>
	using namespace std;
	#include"circle.h"
	class Person
	{
	public:
		int age;
		int* p_height;
		Person(int ref_age, int ref_height)
		{
			age = ref_age;
			p_height = new int(ref_height);
			cout << "堆区开辟的地址为: "  << p_height << endl;
			cout << "有参构造函数被调用," << "年龄是:" << age << ",身高是:" << *p_height << endl;
		}
		~Person()
		{
			cout << p_height << endl;
			if(p_height != NULL)
			{
				delete p_height;
				p_height = NULL;
			}
			cout << "析构函数被调用" << endl;
		}
	};
	void test1()
	{
		Person p1(11, 160);
		Person p2(p1);
	}
	void main()
	{
		test1();
		system("pause");
	}

result:
	堆区开辟的地址为: 0000020FB4F36310
	有参构造函数被调用,年龄是:11,身高是:160
	0000020FB4F36310
	析构函数被调用
	0000020FB4F36310
	报错

深拷贝

  • 重新在堆区申请内存空间
code:
	#include<iostream>
	using namespace std;
	#include"circle.h"
	class Person
	{
	public:
		int age;
		int* p_height;
		Person(int ref_age, int ref_height)
		{
			age = ref_age;
			p_height = new int(ref_height);
			cout << "堆区开辟的地址为: "  << p_height << endl;
			cout << "有参构造函数被调用," << "年龄是:" << age << ",身高是:" << *p_height << endl;
		}
	
		Person(const Person& ref_p)
		{
			age = ref_p.age;
			p_height = new int(*ref_p.p_height);		// 堆区重新申请空间
			//p_height = ref_p.p_height;	//编译器默认实现的是这行代码
			cout << "拷贝构造函数被调用, " << "堆区开辟的地址为:" << p_height << endl;
		}
	
		~Person()
		{
			cout << p_height << endl;
			if(p_height != NULL)
			{
				delete p_height;
				p_height = NULL;
			}
			cout << "析构函数被调用" << endl;
		}
	};
	
	void test1()
	{
		Person p1(11, 160);
		Person p2(p1);
	}
	
	void main()
	{
		test1();
		system("pause");
	}
result:
	堆区开辟的地址为: 0000021DED9361D0
	有参构造函数被调用,年龄是:11,身高是:160
	拷贝构造函数被调用, 堆区开辟的地址为:0000021DED936990
	0000021DED936990
	析构函数被调用
	0000021DED9361D0
	析构函数被调用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/906888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

React前端开发架构:构建现代响应式用户界面

在当今的Web应用开发中&#xff0c;React已经成为最受欢迎的前端框架之一。它的出色性能、灵活性和组件化开发模式&#xff0c;使得它成为构建现代响应式用户界面的理想选择。在这篇文章中&#xff0c;我们将探讨React前端开发架构的核心概念和最佳实践&#xff0c;以帮助您构建…

Googel Earth Engine 配置Python 环境

1. 安装并配置python环境 此处不再赘述 2. 安装 earthengine-api pip install earthengine-api C:\Users\xixi>pip install earthengine-api Collecting earthengine-apiUsing cached earthengine_api-0.1.363-py3-none-any.whl Requirement already satisfied: google-c…

验证评估守护关基安全 赛宁数字孪生靶场创新实践

​​近日&#xff0c;由赛宁网安主办&#xff0c;ISC互联网安全大会组委会协办的第十一届互联网安全大会&#xff08;ISC 2023&#xff09;安全运营实践论坛圆满结束。赛宁网安产品总监史崯出席并作出主题演讲&#xff1a;《基于数字孪生靶场如何开展验证评估》&#xff0c;同时…

Tinderbox 8 for mac介绍安装

Tinderbox 8是一款适用于Mac系统的可视化个人笔记工具&#xff0c;可以帮助您以地图形式存储笔记&#xff0c;生成时间轴&#xff0c;并在完成后将它们作为HTML文件共享。现在Tinderbox可以编写脚本&#xff0c;让Tinderbox与您的所有其他工具更紧密地协作 笔记工具 Tinderbox存…

Centos7卸载|安装JDK1.8|Xshell7批量控制多个终端

一: 使用yum安装的好处是较为方便|环境变量自动配置完成。 1.1: 执行下面的命令,检查是否已安装了jdk # 查看当前是否安装了JDK&#xff0c; [rootwww ~]# rpm -qa |grep java [rootwww ~]# rpm -qa |grep jdk [rootwww ~]# rpm -qa |grep gcj [rootwww ~]# rpm -qa | grep -…

【AWS】创建IAM用户;无法登录IAM用户怎么办?错误提示:您的身份验证信息错误,请重试(已解决)

目录 0.背景问题分析 1.解决步骤 0.背景问题分析 windows 11 &#xff0c;64位 我的问题情景&#xff1a; 首先我创建了aws的账户&#xff0c;并且可以用ROOT用户登录&#xff0c;但是在登录时选择IAM用户&#xff0c;输入ROOT的名字和密码&#xff0c;就会提示【您的身份验证…

安科瑞微机保护装置、智能操控及无线测温产品等电力监控解决方案在山东凯瑞英医药中间体产业链项目的应用

安科瑞 华楠 摘 要&#xff1a;在变电站电力系统中,输电线路是最重要的部分,因此,对输电线路的保护对于整个电力系统的稳定运行有非常重要的意义。继电保护装置是一种反映电力系统故障和不正常运行状态,并且作用于断路器跳闸和发出告警信号的设备&#xff0c;其启到保证电力系…

【openfeign】OpenFeign的使用、GET请求和POST请求

RPC全称是Remote Procedure Call&#xff0c;即远程过程调用&#xff0c;其对应的是我们的本地调用。 RPC的目的是&#xff1a;让我们调用远程方法像调用本地方法一样。 //本地调用 R result orderService.findOrderByUserId(id); //RPC远程调用 orderService为代理对象 R …

蓝牙Mesh设备配网过程及抓包分析

配网过程 说明Mesh消息类型配网过程 信标阶段(Beaconing)Unprovisioned Device beaconLink Open/Link ACK/Link CloseLink OpenLink ACKLink Close 邀请阶段(Invitation)Provisioning InviteProvisioning Capabilities 交换公钥阶段(Exchanging public keys)Provisioning Start…

Oracle数据库经纬度坐标查询优化与结果错误原因分析、SQL中WKT超长文本字符串处理

文章目录 一、Oracle几何空间数据对象和其他数据库的差异二、Oracle查询一个经纬度坐标是否在边界内部2.1 查询条件2.2 查询结果错误&#xff0c;似乎是仅做了MBR匹配2.3 错误原因2.4 解决办法 三、SQL中WKT超长文本在Oracle中如何编写3.1 Oracle中执行含超长文本的SQL报错3.2 …

健身耳机哪个牌子好?推荐几款最适合健身运动用的耳机牌子

对于健身爱好者来说&#xff0c;选择一款适合健身运动的耳机是至关重要的&#xff0c;无论你是跑步、举重还是瑜伽&#xff0c;有适合自己的耳机戴着听歌&#xff0c;能够让你更加投入、更加享受健身的过程。可现在如今的耳机品牌琳琅满目&#xff0c;在选择上自然是要花上不少…

搭建Everything+cpolar在线资料库,实现随时随地访问

Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问 文章目录 Everythingcpolar搭建在线资料库&#xff0c;实现随时随地访问前言1.软件安装完成后&#xff0c;打开Everything2.登录cpolar官网 设置空白数据隧道3.将空白数据隧道与本地Everything软件结合起来总结 前…

山西电力市场日前价格预测【2023-08-22】

日前价格预测 预测明日&#xff08;2023-08-22&#xff09;山西电力市场全天平均日前电价为313.08元/MWh。其中&#xff0c;最高日前电价为354.58元/MWh&#xff0c;预计出现在18: 45。最低日前电价为271.10元/MWh&#xff0c;预计出现在12: 30。 价差方向预测 1&#xff1a; 实…

CrossOver2023虚拟机工具最新版本功能介绍

想要在Mac OS中运行Windows程序&#xff0c;除了使用虚拟机外&#xff0c;使用CrossOver在Mac OS系统中运行Windows程序是非常不错的选择。CrossOver基于Wine技术&#xff0c;可以在Mac OS上运行许多Windows应用程序&#xff0c;而无需安装整个Windows操作系统。 本次发布的Cr…

Paraverse平行云入选启元计划元宇宙TOP20榜单

近日&#xff0c;2023全球数字经济大会互联网3.0峰会上&#xff0c;由中关村大数据产业联盟、中国科协科技传播中心、北京信息化协会共同发起的启元计划发布其成果&#xff0c;同时公布启元计划TOP20以及TOP50企业入选名单。凭借技术与生态优势&#xff0c;「Paraverse平行云」…

docker 05(dockerfile)

一、docker镜像原理 镜像可以复用 二、容器转镜像 将容器保存为镜像[参考] docker commit -a -m 现有容器ID 保存后的名称&#xff1a;版本号 -a :提交的镜像作者&#xff1b; -c :使用Dockerfile指令来创建镜像&#xff1b; -m :提交时的说明文字&#xff1b; -p :…

常用字符串匹配算法

一、BF匹配 BF算法中的BF是Brute Force的缩写&#xff0c;中文叫作暴力匹配算法&#xff0c;也叫朴素匹配算法。 BF算法的时间复杂度很高&#xff0c;是O(nm)&#xff0c;但在实际的开发中&#xff0c;它却是一个比较常用的字符串匹配算法。 第一&#xff0c;实际的软件开发中…

网络安全(黑客)自学笔记建议

前言 1.不要试图以编程为基础的学习开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且实际向安全过渡后可用到的关键知识并不多 一般人如果想要把编程学好再开…

安防视频监控平台EasyCVR视频集中存储平台接入RTSP设备出现离线情况的问题解决方案

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Web Worker的使用

Web Worker 前言一、Web Worker是什么&#xff1f;二、使用步骤2.1 创建 Web Worker2.2 监听消息2.3 发送消息 三、优点与缺点3.1 优点3.2 缺点 总结 前言 JavaScript采用的是单线程模型&#xff0c;也就是说&#xff0c;所有任务只能在一个线程上完成&#xff0c;一次只能做一…