真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

簡單的String類實現(xiàn)及寫時拷貝

#include
using namespace std;

class String
{
public:
	/*String(const char* str=" ")
		:_str(new char[strlen(str)+1])
	{
		strcpy(_str, str);
	}
*/
	String(const char* str = " ")
	{
		if (str == NULL)
		{
			_str = new char;
			_str[0] = '\0';
		}
		else
		{
			_str = new char[strlen(str) + 1];
			strcpy(_str, str);
		}	
	}
	/*String(const String& other)
		:_str(NULL)
	{
		_str = new char[strlen(other._str) + 1];
		strcpy(_str, other._str);
	}*/

	String(const String& other)
		:_str(NULL)
	{
		String tmp(other._str);//創(chuàng)建一個臨時對象
		swap(_str, tmp._str);
	}

	String& operator=(String& other)
	{
		if (this != &other)
		{
			delete[] _str;
			_str = new char[strlen(other._str) + 1];
			strcpy(_str, other._str);
		}
		return *this;//返回值支持鏈?zhǔn)奖磉_(dá)式
	}

	char *GetStr()
	{
		return _str;
	}

	char& operator[](size_t index)//若不用引用,再它返回時會返回一個匿名對象為一個常量不可改變
	{
		return _str[index];
	}
	/*String& operator=(String other)
	{
		swap(_str, other._str);//現(xiàn)代寫法即傳過來一個臨時對象
		return *this;
	}*/

	~String()
	{
		if (_str)
			delete[] _str;
	}
protected:
	char *_str;
};

void Test()
{
	char* ptr = "abcd";
	String s1(ptr);
	String s2(s1);
	String s3("def");
	s3 = s2;
	//s1[0] = 'x';
	cout<

若只定義一個全局的整型變量,它只適用于指向同一個內(nèi)存塊。

創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項目成都網(wǎng)站設(shè)計、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元龍華做網(wǎng)站,已為上家服務(wù),為龍華各地企業(yè)和個人服務(wù),聯(lián)系電話:18980820575

用引用計數(shù)解決淺拷貝后多次析構(gòu)崩潰問題(寫時拷貝),每塊空間都有各自的指針指向。

#include
using namespace std;
class String
{
public:
String(const char* str = " ")
:_str(new char[strlen(str) + 5])
{
*((int*)_str) = 1; //多開4字節(jié)空間保存有幾個指針指向該塊空間
_str += 4;
strcpy(_str, str);
}
/*String(const char* str = " ")
{
if (str == NULL)
{
_str = new char;
_str[0] = '\0';
}
else
{
_str = new char[strlen(str) + 1];
strcpy(_str, str);
}
}*/
String(const String& other)
:_str(other._str)
{
++*(((int*)_str)-1);
}
//String(const String& other)
//:_str(NULL)
//{
//String tmp(other._str);//創(chuàng)建一個臨時對象
//swap(_str, tmp._str);
//}
String& operator=(String& other)
{
if (this != &other)
{
if (--*(((int*)_str) - 1) == 0)
{
//若只有一個指針指向該空間則釋放掉它,讓其重新指向另一塊空間
_str -= 4;//釋放空間時一定從頭釋放
delete[] _str;
}
}
_str = other._str;
++*(((int*)(other._str))-1);
return *this;//返回值支持鏈?zhǔn)奖磉_(dá)式
}
char *GetStr()
{
return _str;
}
char& operator[](size_t index)//若不用引用,再它返回時會返回一個匿名對象為一個常量不可改變
{
return _str[index];
}
/*String& operator=(String other)
{
swap(_str, other._str);//現(xiàn)代寫法即傳過來一個臨時對象
return *this;
}*/
~String()
{
if (_str)
{
if (--*(((int*)_str) - 1) == 0)
{
_str -= 4;  //釋放空間時一定從頭釋放
delete[] _str;
}
}
}
protected:
char *_str;
};
void Test()
{
char* ptr = "abcd";
String s1(ptr);
String s2(s1);
String s3("def");
s3 = s2;
//s1[0] = 'x';
cout << s3.GetStr() << endl;
}

本文標(biāo)題:簡單的String類實現(xiàn)及寫時拷貝
本文路徑:http://weahome.cn/article/jjhsjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部