深复制和浅复制讨论

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

   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

posted on 2012-03-19 16:01  笔记吧... 可能只有自己看得懂  阅读(191)  评论(0编辑  收藏  举报