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

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

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

 

 

 

位拷贝(浅拷贝)举例,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;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwwwyz.html