深拷貝當用一個已初始化過了的自定義類類型對象去初始化另一個新構造的對象的時候,拷貝構造函數就會被自動調用。也就是說,當類的對象需要拷貝時,拷貝構造函數將會被調用。以下情況都會調用拷貝構造函數:(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;}
新聞熱點
疑難解答