C++ 深拷贝和浅拷贝详解

我的梦境 提交于 2020-03-24 01:25:59

前言

在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数。

 

 

 

位拷贝(浅拷贝)举例,a指向b,b的改变其实会影响a的改变,同时a原本指向的空间发生泄漏。

然后这种情况下有了深拷贝。

何时调用?

以下情况都会调用拷贝构造函数:
一个对象以值传递的方式传入函数体
一个对象以值传递的方式从函数返回
一个对象需要通过另外一个对象进行初始化。

然后,我们现在从概念来理解一波

浅拷贝:位拷贝,拷贝构造函数,赋值重载

多个对象共用同一块资源,同一块资源释放多次,崩溃或者内存泄漏。

 

深拷贝:每个对象共同拥有自己的资源,必须显式提供拷贝构造函数和赋值运算符。

 1 class String
 2 {
 3  
 4 public:
 5     const char* c_str()
 6     {
 7         return _str;
 8     }
 9  
10     String(const char* str = "")
11         :_str(new char[strlen(str) + 1])
12     {
13         strcpy(_str, str);
14     }
15     String(const String &s)
16         :_str(NULL)
17     {
18         String tmp(s._str);
19         swap(_str, tmp._str);
20     }
21     ~String()
22     {
23         if (_str)
24         {
25             delete[]_str;
26         }
27     }
28  
29 private:
30     char* _str;

通过开辟空间的方式,进行深拷贝

1 String s1("字符串1");
2 String s2(s1);
3 cout << s2.c_str() << endl;

拷贝成功;

这种方式采取的  拷贝构造,注意这个

1 String(const String &s)
2         :_str(NULL)
3     {
4         String tmp(s._str);
5         swap(_str, tmp._str);
6     }

代码解析:其中this指向拷贝的对象,s指向试图拷贝的原对象。(测试中的  this指向s2,s指向s1)

其中利用构造函数开辟空间,建立临时的tmp,然后进行交换完成拷贝。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!