在copy一个对象时(用一个对象去初始化另外一个对象),会调用类中的拷贝构造函数。如果我们自己没有在类里面写拷贝构造函数,则C++编译器会调用默认的拷贝构造函数。

浅拷贝:如果类定义的对象包含的某个成员是动态内存分配产生的(指针变量成员),你先用该类定义了一个对象1,然后又用这个对象1去初始化另外一个对象2。如果在类里面,没有自己写拷贝构造函数,C++编译器会调用默认的拷贝构造函数,只能将对象1的成员的值赋给对象2的成员,对象1成员指向的内存并没有被复制,也就是说对象1指针成员和对象2指针成员指向的是同一块内存。这样在析构对象时,先析构对象2,对象2指针成员指向的内存被free。由于对象1指针成员和对象2指针成员的值一样,指向的是同一块内存,析构对象1的指针成员时,它所指向的那块内存之前已经被对象2的指针成员free,没法再次free,就会出现宕机(down机),这就是浅拷贝问题。浅拷贝问题在编译阶段不会出问题,只有当程序运行的时候才会发现问题。

浅拷贝问题图解

如果要解决浅拷贝问题,那就必须深拷贝。所谓的深拷贝,就是说不仅将对象1的值拷贝给对象2,而且要将对象1指针成员指向的内存空间也要赋值一份给对象2。这时候,我们就不能再用C++编译器给我们提供的默认拷贝构造函数,必须自己写一份拷贝构造函数。

关于浅拷贝和深拷贝问题,可以参考以下代码:

 1 //myname.h
 2 #pragma once
 3 class myname
 4 {
 5 public:
 6     myname(const char*);
 7     myname(const myname&);
 8     ~myname(void);
 9     void printN();
10
11 private:
12     int len;
13     char* p;
14 };
15
16
17 //myname.cpp
18 #include "myname.h"
19 #include "string.h"
20 #include "malloc.h"
21 #include <iostream>
22
23 #define _CRT_SECURE_NO_WARNINGS
24
25 //构造函数
26 myname::myname(const char* myp)
27 {
28     len=strlen(myp);
29     p=(char*)malloc(sizeof(char)*(len+1));
30     strcpy(p,myp);
31 }
32
33 //拷贝构造函数。如果不自己写该函数,C++编译器会调用默认的拷贝构造函数,则会发生浅拷贝。自己写了该函数,C++编译器就会调用该函数,发生的是深拷贝
34 myname::myname(const myname& n)
35 {
36     len=n.len;
37     p=(char*)malloc(sizeof(char)*(len+1));
38     strcpy(p,n.p);
39 }
40
41
42 void myname::printN()
43 {
44     std::cout<<"name:"<<p<<std::endl;
45 }
46
47
48 myname::~myname(void)
49 {
50     free(p);
51     p=NULL;
52     len=0;
53 }
54
55
56 //main函数
57 #include<iostream>
58 #include "myname.h"
59
60 using namespace std;
61
62 int main()
63 {
64
65     myname name1("Zhang wuji");
66     myname name2(name1);
67     name2.printN();
68
69
70     return 0;
71 }

转载于:https://www.cnblogs.com/jswu-ustc/p/8334954.html

对象的深拷贝和浅拷贝相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. Js中对象的深拷贝和浅拷贝

    浅拷贝:只拷贝对象的基础属性值,对属性值为对象或数组的属性则拷贝指针.  深拷贝:拷贝对象的所有属性作为一个全新的对象.拷贝前后的对象互不影响. 浅拷贝仅仅是指向被复制的内存地址,如果原地址中对象被改 ...

最新文章

  1. linux内核bios,BIOS的启动原理——Linux内核设计学习笔记
  2. 黑马程序员_7k面试题交通管理系统
  3. [轉]MS SQL 显示表结构
  4. ASP.NET页面与IIS底层交互和工作原理详解(一)
  5. 阿里云怎么启动mysql_阿里云启动mysql
  6. 机器翻译市场需求调研报告
  7. 数据库:主键外键作用
  8. python杀掉某个指定的进程
  9. 如何删除计算机中常用列表,清除右键多余菜单,鼠标右键菜单清理的方法(一) -电脑资料...
  10. web前端 第一次作业
  11. BUUCTF 打卡 21/9/1 Many-Time-Pad
  12. 微信小程序导航栏怎么写
  13. 国家开放大学2021春2623中医药学概论题目
  14. Echart统计图-map地图
  15. 无锡室内设计——流行的几种室内装饰风格
  16. Base64在线解析,编码转化为图片
  17. 战争地带2100 mac版
  18. C/C++ 算法分析与设计:递归(年龄问题)
  19. 网络游戏外挂分类及实例
  20. 纽约中央车站将建全球最大苹果专卖店

热门文章

  1. Ethercat系列(10)用QT实现SOEM主站
  2. 勤哲EXCEL服务器将明细项合并到单一数据项里
  3. VMware虚拟化项目中经常使用的三种磁盘置备模式 vmware- vsphere- datastore-disk
  4. 2020Java初级面试题一数据库
  5. RSTP/MSTP的产生,作用及如何配置(带有小实验详解)
  6. Fluent燃料电池系统CFD仿真模型,单通道的单电池模型,包含冷却水道的
  7. 用VLFeat库进行k-means聚类(C++ 实现)
  8. vp230引脚功能_SN65HVD230真正中文资料_应用必备
  9. vs2008命令窗口使用-命令
  10. Cesium坐标系介绍