1. 程式人生 > >模擬實現String類----傳統寫法

模擬實現String類----傳統寫法

面試時經常會遇到一道題,就是寫一個簡單的String類,很多人不假思索的就給出了下面這樣的寫法
class String
{
	String(char* str)
	:_str(new char[strlen(str)])
	{}
	String(const String& s)
		:_str(s._str)
	{}
	String operator=(const String& s)
	{
		if (this != &s)
		{
			_str = s._str;
		}
	}
	~String()
	{
		if (_str)
		{
			delete[] _str;
		}
	}
private:
	char* _str;
};

這是,offer就會跟你說拜拜了,這個程式碼存在很多問題,首先,沒有預設的預設建構函式,第二,在拷貝建構函式中採用的是淺拷貝,使得新拷貝出來的物件跟用來拷貝的引數指標指向了同一塊空間,析構的時候會對著快空間析構兩次,程式就會奔潰了,為了避免這種情況,我們就用拷貝的傳統寫法來實現一個簡單的String類。

這裡,我們先解釋一下深拷貝和淺拷貝的概念

深拷貝:對於物件中動態成員,就不能僅僅簡單地賦值了,而應該重新動態分配空間

淺拷貝:在物件複製時,只是對物件中的成員進行簡單的賦值

class String
{
public:
	String(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)
		{
			char* tmp = new char[strlen(s._str) + 1];
			strcpy(tmp, s._str);
			delete[] _str;
			swap(_str, tmp);
		}

		return *this;
	}
	~String()
	{
		if (_str)
		{
			delete[] _str;
		}
	}
private:
	char* _str;
};
這樣就解決了拷貝構造後西通自動呼叫解構函式重複析構同一塊空間的問題。這樣,一個簡單的String類就完成了。