浅拷贝:简单的赋值拷贝操作。

深拷贝:在堆区申请一块空间,进行拷贝操作。

浅拷贝:编译器提供的拷贝构造函数对传入值进行赋值拷贝操作

#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;
}

代码这东西  真的是三天不敲手生了  一周不敲可能连头文件都能写错了,所以兄弟们记得每天练习!!!冲冲冲!!!

撑不住的时候,可以对自己说声“我好累”,永远不要在心里承认说“我不行”。

对象特性---->深拷贝与浅拷贝相关推荐

  1. 类和对象—对象特性—深拷贝与浅拷贝

    浅拷贝:简单的赋值拷贝操作 深拷贝:在堆区重新申请空间,进行拷贝操作 #include <iostream> using namespace std; class Person{publi ...

  2. python深拷贝一个对象_Python对象的深拷贝和浅拷贝详解

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

  3. Python基础:对象的深拷贝和浅拷贝的区别

    Python基础:对象的深拷贝和浅拷贝的区别 1 变量与对象 2 不可变对象与可变对象 3 直接赋值 4 浅拷贝 5 深拷贝 参考文献 1 变量与对象 对象:内存中存储数据的实体,有明确的类型.在Py ...

  4. java 复制Map对象(深拷贝与浅拷贝)

    java 复制Map对象(深拷贝与浅拷贝) CreationTime--2018年6月4日10点00分 Author:Marydon 1.深拷贝与浅拷贝 浅拷贝:只复制对象的引用,两个引用仍然指向同一 ...

  5. 一文搞懂前端对象的深拷贝与浅拷贝

    在前端开发过程中常常会听到对象的深拷贝与浅拷贝,对于初学者来说,可能是傻傻的分不清楚,本人将详细介绍javascript中对象的深拷贝与浅拷贝. 一.javascript中的数据类型 基础数据类型 字 ...

  6. 浅谈对象的深拷贝和浅拷贝

    浅谈对象的深拷贝和浅拷贝 一.为什么使用对象的拷贝? 1.在普通数据类型赋值 let a=10let b=aa=20console.log(a)//a=20console.log(a)//b=10 因 ...

  7. 【转】C#对象的深拷贝与浅拷贝

    转自:http://www.cnblogs.com/phoenix-rock/archive/2006/11/07/shallowcopy_deepcopy.html 1.         深拷贝是指 ...

  8. PHP中对象的深拷贝与浅拷贝

    2019独角兽企业重金招聘Python工程师标准>>> 最近写了一个php脚本,在脚本中使用到了SplPriorityQueue,会用到两次 因此写了如下: $res=$tmp_re ...

  9. vue对象深拷贝_JS 对象的深拷贝和浅拷贝

    现象 我们先来看一个demo // 我们先申明一个变量str1, // 然后把变量str1负值(拷贝)给变量str2 // 最后对变量str2进行修改操作 var str1 = 'shen' var ...

  10. python 实例对象 浅拷贝_Python 对象的深拷贝与浅拷贝 -- (转)

    本文内容是在<Python核心编程2>上看到的,感觉很有用便写出来,给大家参考参考! 浅拷贝 首先我们使用两种方式来拷贝对象,一种是切片,另外一种是工厂方法.然后使用id函数来看看它们的标 ...

最新文章

  1. ImageResizer for .net 图片处理强大类库
  2. 利用JSON-schema校验请求报文,封装转换错误信息,提示前台
  3. 批量修改历史commit的用户名user.name邮箱user.email
  4. 深入浅出之正则表达式(一)
  5. 普通 项目打包包含第三方jar包
  6. WebPart的使用
  7. Rails UVA - 514(栈)
  8. 安全攻防六:SQL注入,明明设置了强密码,为什么还会被别人登录
  9. 后台查询到前台所需,数据结构转换的通用方法(三) 地图-色斑图的对接
  10. JAVA常用的七种设计模式
  11. redis雪崩、击穿、穿透
  12. JAVA小项目-搜搜移动大厅
  13. 多糖类水凝胶构建制备介绍(瑞禧多糖水凝胶简述)
  14. MyBatis一对多查询collection三表三层查询
  15. 关于Anaconda(Miniconda)虚拟环境中的包的问题pkgs
  16. linux mysql dengl_交作业了!哈哈-·
  17. OpenCV基础应用20例
  18. Java核心技术卷Ⅰ-第四章对象和类
  19. 【复习】系统安全知识点归纳总结
  20. 计算机操作员三级对职称有用吗,辛苦评定的职称,退休之后就没用了?其实还有三个作用你知道吗?...

热门文章

  1. NVIDIA Turing Architecture架构设计(下)
  2. ADAS车辆在行人安全方面得分很低
  3. 可以控制到多低(功率)?
  4. python可视化来分析全国疫情
  5. adb install -r ,-d 等的解释
  6. Windows 系统下使用grep 命令
  7. CoordinatorLayout 和 AppBarLayout 实现的局部点击按钮实现折叠和展开
  8. The application could not be installed: INSTALL_FAILED_NO_MATCHING_ABIS
  9. Android 签名配置
  10. java static 作用详解