深拷贝和浅拷贝

25 篇文章 2 订阅
订阅专栏

浅拷贝:简单的赋值操作

深拷贝:在堆区重新申请空间,进行拷贝操作


例1:

#include<iostream>
using namespace std;

class person
{
public:
	person()
	{
		cout << "默认构造函数" << endl;
	}
	person(int age)
	{
		m_Age = age;
		cout << "有参构造函数" << endl;
	}
	~person()
	{
		cout << "析构函数" << endl;
	}
	int m_Age;
};

int main()
{
	person p1(18);
	cout << "p1的年龄为:" << p1.m_Age << endl;
	person p2(p1);
	cout << "p2的年龄为:" << p2.m_Age << endl;
	system("pause");
	return 0;
}

虽然没有写拷贝构造函数,但是编译器会自动写拷贝构造函数,进行浅拷贝


例2:

#include<iostream>
using namespace std;

class person
{
public:
	person()
	{
		cout << "默认构造函数" << endl;
	}
	person(int age,int height)
	{
		m_Age = age;
		m_Height = new int(height);//new出来的变量需要用指针来接收
		cout << "有参构造函数" << endl;
	}
	~person()
	{
		if (m_Height != NULL)//判断m_Height是否指向空,若不是空则delete,并指向空
		{
			delete m_Height;
			m_Height = NULL;
		}
		cout << "析构函数" << endl;
	}
	int m_Age;
	int* m_Height;
};

int main()
{
	person p1(18,160);
	cout << "p1的年龄为:" << p1.m_Age <<"p1的身高为:"<<*(p1.m_Height) << endl;
	person p2(p1);
	cout << "p2的年龄为:" << p2.m_Age<<"p2的身高为:"<<*(p2.m_Height) << endl;
	system("pause");
	return 0;
}

只打印了一个析构函数,并且崩溃了。

原因:

这是浅拷贝的问题,因为new是堆区开辟的,先进后出,所以先p2执行析构函数,if成立,释放p2的m_Height的内存,后p1执行析构函数,因为p1的m_Height未被释放(两个m_Height指针是独立的,但因为p2的m_Height是拷贝于p1的m_Height,所以指向同一个空间),所以p1的m_Height也被if释放内存,又因为该内存已经被p2的if释放,所以崩溃。

需要自己实现深拷贝来解决浅拷贝带来的问题

#include<iostream>
using namespace std;

class person
{
public:
	person()
	{
		cout << "默认构造函数" << endl;
	}
	person(int age, int height)
	{
		m_Age = age;
		m_Height = new int(height);//new出来的变量需要用指针来接收
		cout << "有参构造函数" << endl;
	}
	person(const person& p)
	{
		cout << "拷贝构造函数" << endl;
		m_Age = p.m_Age;
		m_Height = new int(*p.m_Height);
	}
	~person()
	{
		if (m_Height != NULL)//判断m_Height是否指向空,若不是空则delete,并指向空
		{
			delete m_Height;
			m_Height = NULL;
		}
		cout << "析构函数" << endl;
	}
	int m_Age;
	int* m_Height;
};

int main()
{
	person p1(18, 160);
	cout << "p1的年龄为:" << p1.m_Age << "p1的身高为:" << *(p1.m_Height) << endl;
	person p2(p1);
	cout << "p2的年龄为:" << p2.m_Age << "p2的身高为:" << *(p2.m_Height) << endl;
	system("pause");
	return 0;
}

 

深拷贝里的赋值语句为:m_Height=new int(*p.m_Height);

编译器默认实现的浅拷贝为:m_Height=p.m_Height;

需要重新开辟一个内存,才不会重复释放同一块内存

Python 深拷贝浅拷贝详解
03-09
1、Python 深拷贝浅拷贝概念理解 浅拷贝,指的是重新分配一块内存,创建一个新的对象,但里面的元素是原对象中各个子对象的引用。 深拷贝,是指重新分配一块内存,创建一个新的对象,并且将原对象中的元素,以...
深拷贝浅拷贝一些例子
04-20
深拷贝浅拷贝一些例子
深拷贝浅拷贝理解
weixin_37871174的博客
05-17 161
所谓浅拷贝就是系统自带默认的拷贝构造函数,类都有一个默认的拷贝构造函数,注意这里是拷贝构造函数不是拷贝函数。之所以要强调构造是说这个功能只限于在构造阶段使用,而不是其他赋值阶段使用。浅拷贝有一个问题就是他只能拷贝类中定义的那些在栈上分配的变量,比如private int a,int b,等。但是不能处理类中有指针定义,然后通过如构造函数new空间,析构函数delete空间的场景。因为如果在构造时候直接拷贝的话,会将类中已经new出来的内存地址拷贝到另一个类对象中去保存,然后在另一个类中调用析构时候,就会de
面试题:深拷贝浅拷贝(超级详细,有内存图)
热门推荐
jiang7701037的博客
08-07 9万+
这篇文章竟然写了一上午,亲,请怀着感恩的心阅读!! 深拷贝浅拷贝是经常在面试中会出现的,主要考察你对基本类型和引用类型的理解深度。我在无数次的面试中,应聘者还没有一个人能把这个问题回答情况,包括很多机构的培训老师。这篇文章会让你把基本类型和引用类型的区别搞得清清楚楚,搞清楚这两者的区别,你对任何编程语言的都不怕,因为,这不是js一门语言,是任何编程语言中都需要掌握的知识,而...
Java深入理解深拷贝浅拷贝区别
riemann_的博客
02-13 5万+
一、拷贝的引入 (1)、引用拷贝 创建一个指向对象的引用变量的拷贝。 Teacher teacher = new Teacher("Taylor",26); Teacher otherteacher = teacher; System.out.println(teacher); System.out.println(otherteacher); 输出结果: blog.Teacher@355da2...
理解深拷贝浅拷贝
m0_65558076的博客
03-28 2万+
目录 一、深浅拷贝是什么? 二、深浅拷贝基础(数据类型) 1.基础数据类型(值传递) 2.复杂数据类型(地址传递) 三、深浅拷贝怎样操作(代码示例) 1.浅拷贝: 1)通过Object.assign for in 进行浅拷贝 2.深拷贝: 1)深拷贝最简单的实现是: JSON.parse(JSON.stringify(obj)) 2)实现一个 deepClone 函数 (深拷贝,完美) 3)递归拷贝 一、深浅拷贝是什么? 首先我们要明白一点,js中数据类...
iOS-深拷贝浅拷贝
MinggeQingchun的博客
11-03 2087
一、深拷贝(Deep Copy) 和浅拷贝(Shallow Copy) 浅拷贝:指针拷贝,复制一个新的指针,只想同一块内存区域。实际内存并没有发生拷贝
深拷贝浅拷贝区别是什么?
ConstXiong
06-18 2万+
深拷贝浅拷贝区别是什么? 复制一个 Java 对象 浅拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针,不复制堆内存中的对象。 深拷贝:复制基本类型的属性;引用类型的属性复制,复制栈中的变量 和 变量指向堆内存中的对象的指针和堆内存中的对象。 如何实现对象克隆? 【Java面试题与答案】整理推荐 基础与语法 集合...
面试官:Java深拷贝浅拷贝区别
TimeFriends
08-01 7002
被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。简而言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象深拷贝是一个整个独立的对象拷贝,深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝深拷贝相比于浅拷贝速度较慢并且花销较大。简而言之,深拷贝把要复制的对象所引用的对象都复制了一遍。...
深拷贝浅拷贝的区别
crystal_hhj的博客
08-16 4万+
首先,明确一点深拷贝浅拷贝是针对对象属性为对象的,因为基本数据类型在进行赋值操作时(也就是拷贝)是直接将值赋给了新的变量,也就是该变量是原变量的一个副本,这个时候你修改两者中的任何一个的值都不会影响另一个,而对于对象或者引用数据来说在进行浅拷贝时,只是将对象的引用复制了一份,也就内存地址,即两个不同的变量指向了同一个内存地址,那么在改变任一个变量的值都是该变这个内存地址的所存储的值,所以两个变量的值都会改变。 一、clone()方法 在Java中是用clone()方法实现深拷贝的,比如以下代码在Jav
Python中的深拷贝浅拷贝详解
12-25
变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝深拷贝) 【变量-对象-引用】 在Python中一切都是对象,比如说:3, 3.14, ‘Hello’, [1,2,3,4],{‘a’:1}…… 甚至连type其本身都是对象,type对象 Python...
JavaScript深拷贝浅拷贝概念与用法实例分析
01-19
js中的浅拷贝深拷贝,只是针对复杂数据类型(Objcet,Array)的复制问题。简单来讲浅拷贝深拷贝都可以实现在原有对象的基础上再生成一份的作用。但是根据新生成的对象能否影响到原对象可以分为浅拷贝深拷贝。 ...
C++:round函数用法
Solititude的博客
05-28 368
C++:round函数用法
c++ string模拟实现
最新发布
2302_81705247的博客
06-01 562
模拟实现string类,里面包含四个成员变量,第一个是指向字符数组的指针,第二个变量是目前存放了多少个字符,第三个变量为这个字符数组的容量的大小。最后一个为静态成员变量npos。注意:一个修饰的成员变量可以在类里面初始化(三者缺一不可),而其他成员变量,要声明定义分离,类中声明,类外定义。char* _str;
精通C++ STL(二):string类的模拟实现
Russ_Leo的博客
05-27 843
string类各函数接口。
关于C++的特殊类定制
m0_62126248的博客
05-28 375
C++的一些特殊性质的类如何进行设计
说说深拷贝浅拷贝
03-22
深拷贝浅拷贝是在Java中用于复制对象的两种不同方式。 浅拷贝是指创建一个新对象,然后将原始对象的非静态字段的值复制到新对象中。如果字段是基本类型,则复制其值;如果字段是引用类型,则复制引用而不是实际对象。因此,原始对象和新对象将共享相同的引用对象。这意味着,如果修改其中一个对象的引用对象,另一个对象也会受到影响。 深拷贝是指创建一个新对象,并递归地复制原始对象及其所有引用对象的内容。这意味着,即使修改其中一个对象的引用对象,另一个对象也不会受到影响,因为它们引用的是不同的对象。 在Java中,可以通过实现Cloneable接口和重写clone()方法来实现浅拷贝。使用clone()方法进行浅拷贝时,需要注意被复制的对象以及其引用对象都必须实现Cloneable接口。 要实现深拷贝,可以使用以下几种方式: 1. 通过实现Serializable接口并使用序列化/反序列化来实现深拷贝。 2. 通过递归地复制所有引用对象来手动实现深拷贝。 3. 使用第三方库,如Apache Commons Lang库中的SerializationUtils类或Google Gson库中的toJson()和fromJson()方法来实现深拷贝。 需要注意的是,深拷贝可能会导致性能上的开销,因为需要递归地复制所有引用对象。因此,在选择使用深拷贝还是浅拷贝时,需要根据具体情况进行权衡。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • C++对齐输出(左对齐和右对齐) 34289
  • 函数重载的条件、作用、注意事项 7652
  • cin的输入方式 7154
  • 构造函数调用规则 4300
  • ES的安装和RestClient的操作 4131

分类专栏

  • 知识杂谈 4篇
  • springcloud 17篇
  • 算法基础 57篇
  • c++ 25篇

最新评论

  • 云服务器的mysql数据库自动清空的原因以及解决方法

    潜孤云: 干货满满!我也写了一篇获取【大厂面试真题解析、核心开发学习笔记、最新全套讲解视频、实战项目源码讲义、学习路线简历模板】的文章

  • 本地构建运行docker,或把本地镜像发给云服务器运行

    临界三极管: 还是不会快点出手把手教程

  • 本地构建运行docker,或把本地镜像发给云服务器运行

    Kwan的解忧杂货铺: 你的文章总是让我拓展了视野,增长了见识,每篇博文都是知识的瑰宝,我真的很喜欢你的风格,感谢你的专业分享。期待你的下一次精彩分享。

  • Nacos的集群、负载均衡、环境隔离

    boy1886: userservice: ribbon : NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule 大佬 问下 这段我早在yml写的时候 显示波浪号,没有ribbon : NFLoadBalancerRuleClassName 的 这个怎么办啊

  • 微服务保护

    @katoumegumi: 停更了表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 云服务器的mysql数据库自动清空的原因以及解决方法
  • 用命令给代码上传到远程仓库
  • idea错误地commit后如何处理
2024年7篇
2023年47篇
2022年50篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@katoumegumi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

聚圣源高姓 男孩起名office兼容包官方下载女孩带汐的起名升迁有道文字女孩起名硅酸钙板用途女道士起什么名字大全饮料批发公司起名房山区邮编菜水果公司起名寒假生活答案给女孩起个小名无线网卡连接不上刘星的扮演者爱与魔法男生起什么名字好新水浒传剧情一百分免费起名字浪漫追星社给趣味运动会起个名字瑜字的起名女孩鬼吹灯之山海妖冢Zoomcloudmeetings猫和老鼠之飙风天王五金电器店起名罗氏孩子起名男孩起名馆乡村爱情14部全集免费版第60集星戒属猪陈姓起名字淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化