对象特性---->深拷贝与浅拷贝
浅拷贝:简单的赋值拷贝操作。
深拷贝:在堆区申请一块空间,进行拷贝操作。
浅拷贝:编译器提供的拷贝构造函数对传入值进行赋值拷贝操作
#include<iostream>
using namespace std;class Person
{
public:Person(){cout << "Person无参构造函数的调用" << endl;}Person(int age){cout << "Person有参构造函数的调用" << endl;m_Age = age;}~Person(){cout << "Person析构函数的调用" << endl;}int m_Age;
};void test01()
{Person p1(18);cout << "p1的年龄是: " << p1.m_Age << endl;Person p2(p1);cout << "p2的年龄是: " << p2.m_Age << endl;
}int main()
{test01();system("pause");return 0;
}
上述代码类中我们没有写入拷贝构造函数,但是运行毫无问题,这是编译器为我们提供了拷贝构造函数,并且我们称这种拷贝为浅拷贝;
深拷贝:在堆区申请一块空间,进行拷贝操作。
#include<iostream>
using namespace std;class Person
{
public:Person(){cout << "Person无参构造函数的调用" << endl;}Person(int age,int height){m_Age = age;m_Height = new int(height);cout << "Person有参构造函数的调用" << endl;}~Person(){if (m_Height != NULL) //标准的对堆区空间释放的一个格式{delete m_Height;m_Height = NULL;}cout << "Person析构函数的调用" << endl;}int m_Age;int* m_Height; //这块为什么要把类型写为int*呢,因为堆区申请的空间为空间首地址
}; //s所以拿指针来接收void test01()
{Person p1(18,160);cout << "p1的年龄是: " << p1.m_Age << "身高为: " << *p1.m_Height << endl;Person p2(p1);cout << "p2的年龄是: " << p2.m_Age << "身高为: " << *p2.m_Height << endl;
}int main()
{test01();system("pause");return 0;
}
重点:上述代码中的int* m_Height为什么要将类型写为int*呢 因为堆区申请的空间为空间首地址,所以得拿指针来接收
但是很不幸的是 上述代码会报错:
错误原因就是:其中0x112233只是举个例子而已,并不是说地址真的是0x112233
因为编译器所给出的拷贝构造函数如下图,所以会出现重复释放内存而报错的情况
Person(const Person& p)
{cout << "Person拷贝构造函数的调用" << endl;m_Age = p.m_Age;m_Height = p.m_Height; //如果用编译器给的拷贝构造函数就是这样的底层逻辑
}
正确的拷贝构造函数:
Person(const Person& p)
{cout << "Person拷贝构造函数的调用" << endl;m_Age = p.m_Age;m_Height = new int(*p.m_Height);
}
原理如下:
这就是深拷贝的原理。
深拷贝所有代码如下:
#include<iostream>
using namespace std;class Person
{
public:Person(){cout << "Person无参构造函数的调用" << endl;}Person(int age,int height){m_Age = age;m_Height = new int(height);cout << "Person有参构造函数的调用" << endl;}Person(const Person& p){cout << "Person拷贝构造函数的调用" << endl;m_Age = p.m_Age;m_Height = new int(*p.m_Height);}~Person(){if (m_Height != NULL){delete m_Height;m_Height = NULL;}cout << "Person析构函数的调用" << endl;}int m_Age;int* m_Height;
};void test01()
{Person p1(18,160);cout << "p1的年龄是: " << p1.m_Age << "身高为: " << *p1.m_Height << endl;Person p2(p1);cout << "p2的年龄是: " << p2.m_Age << "身高为: " << *p2.m_Height << endl;
}int main()
{test01();system("pause");return 0;
}
代码这东西 真的是三天不敲手生了 一周不敲可能连头文件都能写错了,所以兄弟们记得每天练习!!!冲冲冲!!!
撑不住的时候,可以对自己说声“我好累”,永远不要在心里承认说“我不行”。
对象特性---->深拷贝与浅拷贝相关推荐
- 类和对象—对象特性—深拷贝与浅拷贝
浅拷贝:简单的赋值拷贝操作 深拷贝:在堆区重新申请空间,进行拷贝操作 #include <iostream> using namespace std; class Person{publi ...
- python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解
本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...
- Python基础:对象的深拷贝和浅拷贝的区别
Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...
- java 复制Map对象(深拷贝与浅拷贝)
java 复制Map对象(深拷贝与浅拷贝) CreationTime--2018年6月4日10点00分 Author:Marydon 1.深拷贝与浅拷贝 浅拷贝:只复制对象的引用,两个引用仍然指向同一 ...
- 一文搞懂前端对象的深拷贝与浅拷贝
在前端开发过程中常常会听到对象的深拷贝与浅拷贝,对于初学者来说,可能是傻傻的分不清楚,本人将详细介绍javascript中对象的深拷贝与浅拷贝. 一.javascript中的数据类型 基础数据类型 字 ...
- 浅谈对象的深拷贝和浅拷贝
浅谈对象的深拷贝和浅拷贝 一.为什么使用对象的拷贝? 1.在普通数据类型赋值 let a=10let b=aa=20console.log(a)//a=20console.log(a)//b=10 因 ...
- 【转】C#对象的深拷贝与浅拷贝
转自:http://www.cnblogs.com/phoenix-rock/archive/2006/11/07/shallowcopy_deepcopy.html 1. 深拷贝是指 ...
- PHP中对象的深拷贝与浅拷贝
2019独角兽企业重金招聘Python工程师标准>>> 最近写了一个php脚本,在脚本中使用到了SplPriorityQueue,会用到两次 因此写了如下: $res=$tmp_re ...
- vue对象深拷贝_JS 对象的深拷贝和浅拷贝
现象 我们先来看一个demo // 我们先申明一个变量str1, // 然后把变量str1负值(拷贝)给变量str2 // 最后对变量str2进行修改操作 var str1 = 'shen' var ...
- python 实例对象 浅拷贝_Python 对象的深拷贝与浅拷贝 -- (转)
本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...
最新文章
- ImageResizer for .net 图片处理强大类库
- 利用JSON-schema校验请求报文,封装转换错误信息,提示前台
- 批量修改历史commit的用户名user.name邮箱user.email
- 深入浅出之正则表达式(一)
- 普通 项目打包包含第三方jar包
- WebPart的使用
- Rails UVA - 514(栈)
- 安全攻防六:SQL注入,明明设置了强密码,为什么还会被别人登录
- 后台查询到前台所需,数据结构转换的通用方法(三) 地图-色斑图的对接
- JAVA常用的七种设计模式
- redis雪崩、击穿、穿透
- JAVA小项目-搜搜移动大厅
- 多糖类水凝胶构建制备介绍(瑞禧多糖水凝胶简述)
- MyBatis一对多查询collection三表三层查询
- 关于Anaconda(Miniconda)虚拟环境中的包的问题pkgs
- linux mysql dengl_交作业了!哈哈-·
- OpenCV基础应用20例
- Java核心技术卷Ⅰ-第四章对象和类
- 【复习】系统安全知识点归纳总结
- 计算机操作员三级对职称有用吗,辛苦评定的职称,退休之后就没用了?其实还有三个作用你知道吗?...
热门文章
- NVIDIA Turing Architecture架构设计(下)
- ADAS车辆在行人安全方面得分很低
- 可以控制到多低(功率)?
- python可视化来分析全国疫情
- adb install -r ,-d 等的解释
- Windows 系统下使用grep 命令
- CoordinatorLayout 和 AppBarLayout 实现的局部点击按钮实现折叠和展开
- The application could not be installed: INSTALL_FAILED_NO_MATCHING_ABIS
- Android 签名配置
- java static 作用详解