c++string的深拷貝

在c++中當我們想要去拷貝一個字符串的時候就會存在兩種方式:

                1 淺拷貝方式 

                2深拷貝方式

淺拷貝:

所謂的淺拷貝就是讓當前的指針指向一塊已存在的區域,和其他指針共享同一塊地址空間


淺拷貝所帶來的問題是當程序結束的時候,對象d1和d2都會去調用析構函數清零這個快空間,而一塊空間析構兩次可能就會導致程序崩潰。(這裏暫不考慮寫時拷貝)

深拷貝:

當我們進行深拷貝的時候,會去重新開闢一塊和待拷貝空間一樣大的空間,然後把源空間裏的數據拷貝到已開闢的目標空間裏面去。


深拷貝解決了簡單的淺拷貝帶來的重複析構問題。


下面具體的用代碼實現一下深拷貝:

#define _CRT_SECURE_NO_DEPRECATE 1
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;

class String
{
public:
	String(const char* str)
		:_str(new char[strlen(str)+1])
		{
		strcpy(_str,str);
	    }
	String(const String& d)
		:_str(new char[strlen(d._str)+1])
		{
		strcpy(_str,d._str);
	    }
	~String()
	{
		cout<<"~String"<<endl;

		delete[] _str;
		_str = NULL;
	}
	//深拷貝的傳統寫法
	/*String& operator=(const String& d)
	{
	//一:首先考慮是不是自己給自己賦值
	//二:如果不是自己給自己賦值  1釋放掉自己的已有空間    2開闢和目標對象大小一樣的空間  3將源空間的數據複製到已開闢的目標空間內
		if(_str == d._str)
		{
			return *this;
		}
		else
		{
			delete[]_str;
			_str = new char[strlen(d._str)+1]; 
			strcpy(_str,d._str);
		}
		return *this;
	}*/
	//深拷貝的簡便寫法
	void Swap(String& d)
	{
		char* tmpchar;
		tmpchar = this->_str;
		this->_str = d._str;
		d._str = tmpchar;
	}
	String& operator=(const String& d)
	{
		//一:考慮是否自己給自己賦值
		//二:如果不是自己給自己賦值  1 調用構造函數去構造一個臨時對象  2讓臨時對象和目標對象交換空間 
		if(_str == d._str)
		{
			return *this;
		}
		else
		{
			String tmp(d._str);
		    Swap(tmp);
			return *this;
		}
	}
void Print_Str();
private:
	char* _str;
	
};
void String:: Print_Str()
{
	cout<<this->_str<<endl;
}
int main()
{
	
	String s1("abc");
	String s2("def");
	s1 = s2;
	s1.Print_Str();
	
	system("pause");

	return 0;

}


傳統寫法是自己開闢空間然後複製數據。

簡便寫法是讓構造函數去構造一個源對象,然後讓目標對象和臨時對象交換空間,這樣目標空間就得到了與源空間一樣的數據(就好像考試結束的時候,你把別人的卷子跟自己的卷子名字互換了,盜竊了別人的勞動成功,哈哈)。(這樣既保證數據與源空間一致,也避免了重複析構)

發佈了55 篇原創文章 · 獲贊 47 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章