溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++ String的實現(xiàn)

發(fā)布時間:2020-07-17 08:47:30 來源:網(wǎng)絡(luò) 閱讀:414 作者:nna_0914 欄目:編程語言

String的實現(xiàn)需要注意的是String的拷貝構(gòu)造。它的拷貝構(gòu)造有深拷貝和淺拷貝之分。

我們先來用淺拷貝實現(xiàn)String

class String
{
public:
	String()
	{
		str = new char('A');
	}
	String(char *s)
	{
		str = new char[strlen(s) + 1];
		if (str != NULL)
		{
			strcpy(str, s);
		}
	}
	String(const String& s)
	{
		str=s.str;
	}
	String& operator=(const String& s)
	{
		if (this != &s)
		{
		      str=s.str;
		}
		return *this;
	}

private:
	char *str;
};

void test()
{
	String s1("hello world");
	String s2(s1);
}

當(dāng)s1,s2出自的作用域時,會自動調(diào)用析構(gòu)函數(shù),此時s1,s2指向同一片內(nèi)存。所以這塊內(nèi)存會被釋放兩次,程序會崩潰。

C++ String的實現(xiàn)


所以在這里我們要采用深拷貝的方式


構(gòu)造函數(shù)和賦值運算符重載

String(const String& s)
	{
		str = new char[strlen(s.str) + 1];    //new出來一塊新的空間
		if (str)
		{
			strcpy(str, s.str);
		}
	}
	String& operator=(const String& s)
	{
		if (this != &s)
		{
			if (str != NULL)
			{
				delete[] str;
				str = new char[strlen(s.str) + 1];
				strcpy(str, s.str);
			}
		}
		return *this;
	}

C++ String的實現(xiàn)

還有一種方法可以解決這個一塊空間會被多次釋放的問題,那就是寫時拷貝

在第一次構(gòu)造一個對象的時候,多開辟四個字節(jié)當(dāng)做計數(shù)器,用來記錄有幾個指針指向這塊空間。每當(dāng)用這塊空間拷貝構(gòu)造一個新對象或者把這塊空間賦給另外一個對象時,計數(shù)器相應(yīng)增加。那么當(dāng)調(diào)用析構(gòu)函數(shù)時,每次計數(shù)器減一,當(dāng)計數(shù)器減到一時,說明只有一個指針指向這塊空間,此時再把這塊空間delete,就不會出現(xiàn)一塊空間多次釋放的問題了。

class String
{
public:
	String(char *str="")
		:_str(new char[strlen(str)+1+4])
	{
		*((int *)_str) = 1;         //將開辟的空間前4個字節(jié)強(qiáng)制轉(zhuǎn)換成整型并賦為1
		_str = _str + 4;       //將_str重新定為真正字符串開始的地方,這樣比較方便
		strcpy(_str, str);     //不用每次向后找
	}
	String(const String& str)
	{
		_str = str._str;
		(*((int *)(_str - 4)))++;    
	}
	~String()
	{
		if (*_str != NULL)    
		{
			if (((*((int *)(_str - 4)))--) == 0)    //判斷計數(shù)器是否減到0
			{
				delete[] (_str-4);
			}
		}
	}
public:
	String& operator=(const String& str)
	{
		if (this != &str)
		{
			if (((*((int *)(_str - 4)))--) == 0)
			{
				delete[] (_str-4);
			}
			_str = str._str;
			(*(int *)(str._str - 4))++;
			return *this;
		}
	}
	char& operator[](int index)
	{
		char *tmp = _str;
		if (((*(int *)(_str - 4))-1) != 0)
		{
			(*(int *)(_str - 4))--;
			_str = new char[strlen(_str) + 5];
			(*(int *)(_str + 4)) = 1;
			_str = _str - 4;
			strcpy(_str, tmp);
		}
		return _str[index];
	}
private:
	char *_str;
};

C++ String的實現(xiàn)

但是這樣做也有一個壞處。就是指向同一塊空間的指針,只要改一個指針指向的內(nèi)容,等于其他的指針指向的內(nèi)容也跟著改變了。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI