1. 程式人生 > >c++:深淺拷貝總結(深拷貝的傳統和現代寫法)

c++:深淺拷貝總結(深拷貝的傳統和現代寫法)

深淺拷貝區別:

  • 淺拷貝只拷貝指標,但拷貝後兩個指標指向同一個記憶體空間
  • 深拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝
  • 呼叫拷貝建構函式後,淺拷貝還有聯絡,深拷貝的兩個物件完全獨立。
  • 淺拷貝類似於檔案建立快捷方式,而深拷貝好比檔案複製。
  • 編譯器預設提供的預設拷貝建構函式是淺拷貝,深拷貝的建構函式需自己實現。

注意:淺拷貝多個物件共用一個資源,當一個物件銷燬時,資源就會釋放。如果對另一個對在進行銷燬。會因為資源重複釋放造成程式崩潰!

     

深拷貝的傳統和現代寫法:

傳統寫法:開闢空間複製內容

class String
{
public:
	String(const char* str = "")
		:_str(new char[strlen(str) + 1])
	{
		strcpy(_str,str);
	}
	String(const String& s)
		:_str(new char[strlen(s._str) + 1])
	{
		strcpy(_str,s._str);
	}
	String& operator=(const String& s)
	{
		//如果用自己對自己賦值直接返回
		if (this != &s)
		{
			delete[] _str;
			_str = new char[strlen(s._str) + 1];
			strcpy(_str,s._str);
			//方法二:
			/*char* tmp = new char[strlen(s._str) + 1];
			strcpy(tmp, s._str);
			delete[] _str;
			_str = tmp;*/
		}
		return *this;
	}
	~String() 
	{
		delete[] _str;
	}
	
private:
	char* _str;
};

現代寫法:藉助指標交換

class String
{
public:
	String(const char* str = "")
		:_str(new char[strlen(str) + 1])
	{
		strcpy(_str,str);
	}
	String(const String& s)
		:_str(NULL)
	{
		String tmp(s._str);
		swap(_str,tmp._str);
	}
	String& operator=(String s)
	{
		swap(_str,s._str);
		return *this;
	}
	~String()
	{
		delete[] _str;
	}
private:
	char* _str;
};