浅拷贝和深拷贝都是相对拷贝构造函数来讲的

下面代码实现浅拷贝,

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <string>
 4 using namespace std;
 5
 6 class A
 7 {
 8    public :
 9        A(int a=0):m_num(a){};
10        A(const A &arr);
11        int set_num();
12    private:
13      int m_num;
14 };
15
16 A::A(const A &arr)
17  {
18      m_num=arr.m_num;
19  }
20 int A::set_num()
21  {
22     return m_num;
23  }
24 int main (void)
25 {
26    A arr1(5);
27    A arr2(arr1);
28    cout << "arr1="<<arr1.set_num()<<endl<<"arr2="<<arr2.set_num()<<endl;
29 return 0;
30 }

再增加一个类成员指针变量,

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <string>
 4 using namespace std;
 5
 6 class A
 7 {
 8    public :
 9        A(int a=0)
10        {
11            cout <<"A"<<endl;
12         m_num=a;
13         m_a=new int[m_num];
14        };
15        A(const A &arr);
16        int set_num();
17        ~A();
18    private:
19      int m_num;
20      int *m_a;
21 };
22
23 A::A(const A &arr)
24  {
25       cout << "&A"<<endl;
26       m_a=arr.m_a;
27      m_num=arr.m_num;
28  }
29 int A::set_num()
30  {
31     return m_num;
32  }
33 A::~A()
34 {
35     cout << "~A"<<endl;
36     delete []m_a;
37 }
38 int main (void)
39 {
40    A arr1(5);
41    A arr2(arr1);
42    cout << "arr1="<<arr1.set_num()<<endl<<"arr2="<<arr2.set_num()<<endl;
43 return 0;
44 }

上面程序拷贝构造函数中把对象的指针地址拷贝给当前对象的指针地址,

当执行到析构函数,以为有两个对象,不是要删除两次吗,当运行第一次时没有问题,

当运行第二次程序就会崩溃。

那要解决这个问题就要深拷贝了。

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <string>
 4 using namespace std;
 5
 6 class A
 7 {
 8    public :
 9        A(int a=0)
10        {
11            cout <<"A"<<endl;
12         m_num=a;
13         m_a=new int[m_num];
14        };
15        A(const A &arr);
16        int set_num();
17        void set_m_a();
18        ~A();
19    private:
20      int m_num;
21      int *m_a;
22 };
23
24 void A::set_m_a()
25 {
26     for (int i=0;i<m_num;i++)
27     {
28         m_a[i]=i;
29         cout << "m_a["<<i<<"]="<<m_a[i]<<endl;
30     }
31
32 }
33 A::A(const A &arr)
34  {
35       m_num=arr.m_num;
36       cout << "&A"<<endl;
37       m_a=new int [arr.m_num];
38       for (int i=0;i<arr.m_num;i++)
39       {
40         m_a[i]=arr.m_a[i];
41       }
42
43
44  }
45 int A::set_num()
46  {
47     return m_num;
48  }
49 A::~A()
50 {
51     cout << "~A"<<endl;
52     delete []m_a;
53 }
54 int main (void)
55 {
56    A arr1(5);
57    A arr2(arr1);
58    cout << "arr1="<<arr1.set_num()<<endl<<"arr2="<<arr2.set_num()<<endl;
59    cout << "arr1.m_a=";arr1.set_m_a();
60    cout<<endl;
61    cout << "arr2.m_a=";arr2.set_m_a();
62 return 0;
63 }

這样对象之间的赋值就不是地址之间的赋值,也不会同块内存中释放两次。

转载于:https://www.cnblogs.com/biyongyao/p/5030993.html

C++ 中的深入浅拷贝和深拷贝相关推荐

  1. 深入浅出理解Java中数组的浅拷贝和深拷贝

    深入浅出带你理解Java中数组的浅拷贝和深拷贝 深浅拷贝的区别 深浅拷贝的区别 所谓浅拷贝,一般指的就是对象引用,例如 Teacher teacher = new Teacher(); teacher ...

  2. Python中赋值、浅拷贝、深拷贝

    一.赋值 Python中赋值就是对对象的简单引用,这一点与C++不同,如下: a = [1, '123', [12, 'C']] b = a 在上述情况下,a和b是一样的,他们指向同一片内存,b不过是 ...

  3. python数组元素赋值_Python数组中赋值,浅拷贝,深拷贝的区别

    要用到的工具 id(a) 函数用于获取对象a的内存地址. a is b 是用来比较 a 和 b 是不是指向同一个内存单元. 1. 直接赋值: 如下图用工具比较后发现直接赋值后两个列表指向同一内存单元. ...

  4. js之浅拷贝和深拷贝

    js数据类型主要分基本数据类型和引用数据类型.前者包括Number,String等,后者主要是Object,因此以下会针对不同的数据类型来分析,需要的朋友可以参考一下 1.js内存 js内存,或者说大 ...

  5. Java中的浅拷贝与深拷贝

    一.引用拷贝与对象拷贝 class Person implements Cloneable{private String name;private int age;...省略get和set方法 pro ...

  6. 43 JavaScript中的浅拷贝与深拷贝

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.浅拷贝与深拷贝 浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用. 深拷贝拷贝多层,每 ...

  7. 说说JS中的浅拷贝与深拷贝

    outline: 为什么要说JS中深拷贝与浅拷贝 JS对类型的分类 immutable与mutable 简单类型检测 浅拷贝VS深拷贝 为什么要说JS中深拷贝与浅拷贝 近来在研读underscore的 ...

  8. python中的引用、浅拷贝和深拷贝

    在python中,有一句话:"一切皆为对象,一切皆为对象的引用",所以 只要记住这句话就很容易清楚python中的引用.浅拷贝和深拷贝了. 1. 引用 python中的引用是经常使 ...

  9. C#中的浅拷贝和深拷贝

    C#中有两种类型变量,一种是值类型变量,一种是引用类型变量.对于前者,copy是属于全盘复制:而对于后者,一般的copy只是浅copy,相当于只传递一个引用指针一样.因此对于后者进行真正copy的时候 ...

最新文章

  1. [分类整理IV]微软等100题系列V0.1版:字符串+数组面试题集锦
  2. Kubernetes — 安装 Metrics Server
  3. python3爬虫实例-自己动手,丰衣足食!Python3网络爬虫实战案例
  4. Linux系统目录结构说明
  5. 五分钟没有操作自动退出_遇到不喜欢的小动物怎么办?教你五分钟友好的送走小动物!...
  6. 程序详细设计之代码编写规范_我在不编写任何代码的情况下建立了一个设计策划网站
  7. angularjs中使用swiper时不起作用,最后出现空白位
  8. 随堂小测冲刺.第19天
  9. apache 统计404日志_Apache监控与调优(四)Apachetop监控
  10. jenkins插件调用job_【Jenkins插件_实践】1.Job Import Plugin迁移Jobs
  11. php做姓名隐藏,PHP只显示姓名首尾字符,隐藏中间字符并用*替换
  12. matlab调和均值滤波_matlab均值滤波(原创).doc
  13. Linux---单例模式
  14. 科技庄园(背包dp)---对于蒟蒻来说死了一大片的奇题
  15. 硬币找零,最长上升子序列,背包问题等动态规划问题详解
  16. OpenCV最简JAVA版范例
  17. 生前个个说恩深,死后人人欲扇魂。画虎画皮难画骨,知人知面不知心。
  18. ZZULIOJ-1095: 时间间隔(多实例测试)(Java)
  19. 人民币趣味品--收藏新宠
  20. java通过poi-tl模板引擎生成表格(Word)

热门文章

  1. echarts折线图y轴根据数值自动_R语言基础绘图教程——第3章:折线图和带状图...
  2. PHP的continue语句,PHP continue语句
  3. 蓝牙模块耳机做蓝牙透传_WiFi、蓝牙在工业领域的数据透传应用_SKYLAB 无线模块...
  4. html 通用css,需要有关通用HTML / CSS布局的帮助
  5. 【NCRE】2020年9月全国计算机等级考试,计算机二级MS Office高级应用划水贴
  6. Android替换view父节点,android – issue:指定的子节点已经有父节点.您必须首先在孩子的父母上调用removeView()...
  7. lua mysql 事务_为什么在 Redis 实现 Lua 脚本事务?-阿里云开发者社区
  8. java中实现方法重载怎么声明_java 接口中如何声明类似于重载的方法?
  9. java中包的概念及作用_Java中包的概念和使用实战
  10. 二叉树的前序中序后序 递归与非递归解法