日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++String的實現(xiàn)-創(chuàng)新互聯(lián)

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

公司主營業(yè)務(wù):網(wǎng)站設(shè)計制作、做網(wǎng)站、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊有機(jī)會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出咸陽免費(fèi)做網(wǎng)站回饋大家。

我們先來用淺拷貝實現(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ù)和賦值運(yùn)算符重載

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)容也跟著改變了。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


分享名稱:C++String的實現(xiàn)-創(chuàng)新互聯(lián)
本文地址:http://www.dlmjj.cn/article/dijddi.html