深拷贝

来源:互联网 发布:白乐桑 知乎 编辑:程序博客网 时间:2024/05/01 17:08
深拷贝

当用一个已初始化过了的自定义类类型对象去初始化另一个新构造的对象的时候,拷贝构造函数就会被自动调用。也就是说,当类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
(1)一个对象以值传递的方式传入函数体 
(2)一个对象以值传递的方式从函数返回 
(3)一个对象需要通过另外一个对象进行初始化。

如果在类中没有显式地声明一个拷贝构造函数,那么,编译器将会自动生成一个默认的拷贝构造函数,该构造函数完成对象之间的位拷贝。

浅拷贝(影子克隆):只复制对象的基本类型,对象类型,仍属于原来的引用.深拷贝(深度克隆):不紧复制对象的基本类,同时也复制原对象中的对象.就是说完全是新对象产生的.浅 拷贝和深拷贝之间的区别:浅拷贝是指将对象中的数值类型的字段拷贝到新的对象中,而对象中的引用型字段则指复制它的一个引用到目标对象。如果改变目标对象 中引用型字段的值他将反映在原是对象中,也就是说原始对象中对应的字段也会发生变化。深拷贝与浅拷贝不同的是对于引用的处理,深拷贝将会在新对象中创建一 个新的和原是对象中对应字段相同(内容相同)的字段,也就是说这个引用和原是对象的引用是不同的,我们在改变新对象中的这个字段的时候是不会影响到原始对 象中对应字段的内容。所以对于原型模式也有不同的两种处理方法:对象的浅拷贝和深拷贝。
#include<iostream>using namespace std;class String{public: String(const char *pStr = "") {  if(NULL == pStr)  {   _pStr = new char[1];   *_pStr ='\0';  }  else  {   _pStr = new char[strlen(pStr)+1];   strcpy(_pStr,pStr);  } } String(const String &s)  :_pStr(new char[strlen(s._pStr)+1]) {  strcpy(_pStr,s._pStr); } String& operator=(const String &s) {  if(this != &s)  {   char *pTemp = new char[strlen(s._pStr)+1];   strcpy(pTemp,s._pStr);   delete[] _pStr;   _pStr = pTemp;  }  return *this; } ~String() {  if(_pStr)  {   delete[] _pStr;   _pStr = NULL;  } }private: char *_pStr;};void Funtest(){ String s1 =  "111111"; String s2(s1);// cout<<s2._pStr<<endl;}int main(){ Funtest(); return 0;}



0 0