zoukankan      html  css  js  c++  java
  • 深复制和浅复制讨论

    复制构造函数发生的三种情况:

       1、一个类对象通过另外一个对象进行初始化时;

       2、一个类对象以值传递的方式传入函数体中时;

       3、一个类对象以值传递的方式从函数返回时;

    ————————————————————————————————————————————————————————————

    复制构造函数的作用:依次复制每个非静态数据成员来给类对象,叫做复制构造过程。

    View Code
     1 #include <iostream>
    2 #include <string>
    3 using namespace std;
    4 class Test
    5 {
    6 public:
    7 char *buf;
    8 Test(void)
    9 { buf = NULL; }
    10 Test(const char * str)
    11 {
    12 buf = new char[strlen(str) + 1];
    13 strcpy_s(buf,strlen(str)+1,str); // vs2008版本
    14 }
    15 ~Test()
    16 { delete buf; buf = NULL; }
    17 };
    18 void main()
    19 {
    20 Test t1("Hello");
    21 Test t2 = t1;
    22 cout << "t1.buf == t2.buf" << (t1.buf == t2.buf?"yes":"no") << endl;
    23 }

    输出:

       t1.buf == t2.buf yes

       程序崩溃

    在Test的析构函数中设置一个断点,调试可以看出:在t2的析构时,程序崩溃。

    原因分析:Test t2 = t1; // 调用Test的复制构造函数,显然会调用默认复制构造函数。从而把t1的buf 成员地址给t2的buf成员。

                                     // 在析构时,两次释放了同一块内存,所以出现了出现崩溃。

    这种让新旧两个对象指向同一个外部内存的现象,叫做浅复制;

    那么,自然当在复制构造时,让新旧对象指向不同的外部内存的现象,就叫做深复制了;

    ————————————————————————————————————————————————————————————————————

    现在,问题了解清楚了。那么,怎么解决上面的问题了?

    直接上代码:

    View Code
     1 #include <iostream>
    2 #include <string>
    3 using namespace std;
    4 class Test
    5 {
    6 public:
    7 char *buf;
    8 Test(void)
    9 {
    10 buf = NULL;
    11 }
    12 Test(Test &t) //增加一个自定义的复制构造函数,手动申请一块内存解决这个问题
    13 {
    14 buf = new char[strlen(t.buf)+1];
    15 strcpy_s(buf,strlen(t.buf)+1,t.buf);
    16 }
    17 Test(const char * str)
    18 {
    19 buf = new char[strlen(str) + 1];
    20 strcpy_s(buf,strlen(str)+1,str); // vs2008版本
    21 }
    22 ~Test()
    23 {
    24 delete buf;
    25 buf = NULL;
    26 }
    27 };
    28 void main()
    29 {
    30 Test t1("Hello");
    31 Test t2 = t1;
    32
    33 cout << "t1.buf == t2.buf" <<
    34 (t1.buf == t2.buf?"yes":"no") << endl;
    35
    36 }

    输出:

      t1.buf == t2.buf yes

  • 相关阅读:
    2019春季第五周作业
    第四周作业
    第三周作业编程总结
    第四周编程总结
    第三周编程总结
    2019春第一周作业编程总结
    我人生中对我影响深刻的三个老师
    秋季学习总结
    自我介绍
    2019春第10周作业
  • 原文地址:https://www.cnblogs.com/xuxu8511/p/2406207.html
Copyright © 2011-2022 走看看