欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

c++中有關(guān)自定義string的那些為什么-創(chuàng)新互聯(lián)

1、為什么我們要學(xué)會(huì)寫自定義string類

10年積累的成都網(wǎng)站建設(shè)、成都網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站后付款的網(wǎng)站建設(shè)流程,更有福海免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

    面試官愛考,你有辦法嗎,沒有-.-c++中 有關(guān)自定義string的那些為什么

2、自定義string類應(yīng)該如何正確書寫

    quote一句c++primer中的話:

     類的安全性和處理正確性的不夠,需要類的設(shè)計(jì)者(也就是我們)去寫拷貝構(gòu)造和賦值運(yùn)算符重載函數(shù),而最困難的不是如何書寫而是讓我們自己本身意識(shí)到需要這樣做。

關(guān)于MyString不得不說的就是:深淺拷貝問題,這個(gè)究其原因就是它的成員變量是個(gè)char *類型的,如果我們懶到要讓編譯器自己幫我們?nèi)ソ?gòu)造、拷貝構(gòu)造,賦值運(yùn)算符重載這些函數(shù),那么問題就是很大滴,因?yàn)樗埠躭azy,它做的操作就是讓兩個(gè)指針指向同一個(gè)地方。

舉個(gè)栗子看:

c++中 有關(guān)自定義string的那些為什么

那么下面就說說如何寫一個(gè)正確的string:

    首先c++中string它是個(gè)類對(duì)吧

    那么我們就寫一個(gè)類出來(成員函數(shù)和成員變量)

class MyString
{
private:
	char *_pData;//對(duì),你沒看錯(cuò),只需要一個(gè)char型指針就可以實(shí)現(xiàn)哦
public:
	//首先一個(gè)類要有構(gòu)造函數(shù)-->保證類的成員變量被正確的初始化
	//第一種寫法----正確但不是最優(yōu)
	MyString(char *pData=NULL)
	{
		if (pData==NULL)
		{
			_pData=new char[1];
			_pData[0]='\0';
		}
		else
		{
			_pData=new char[strlen(pData)+1];
			strcpy(_pData,pData);
		}
	}
	//第二種寫法--比第一種更優(yōu):使用初始化列表
	MyString(char *pData=NULL)
		:pData(new char[strlen(pData)+1])
	{
		strcpy(_pData,pData);
	}
	//既然在構(gòu)造中進(jìn)行了new那么相對(duì)的是不是要在析構(gòu)中去delete?
	~MyString()
	{
		if (_pData)//這里可以直接不用判斷,think about why?
		{
			delete []_pData;
		}
	}
	//拷貝構(gòu)造-----?為什么需要寫,因?yàn)槌蓡T變量是指針,如果我們不進(jìn)行自己去寫
	//就會(huì)出現(xiàn)安全性和正確性的問題,兩個(gè)指針指向一個(gè)空間,當(dāng)其中一個(gè)析構(gòu)后,
	//另外一個(gè)就無法再去訪問這片空間,會(huì)出現(xiàn)非法操作
	//考點(diǎn):形參必須傳入的是該類型的引用,不然在實(shí)參傳給形參時(shí)
	//就會(huì)發(fā)生值傳遞,進(jìn)行拷貝構(gòu)造,那么這個(gè)拷貝構(gòu)造就是一個(gè)死循環(huán)
	//第一種寫法
	MyString(const MyString &mstr)
	{
		if (strlen(mstr._pData)==0)
		{
			_pData=new char[1];
			_pData[0]='\0';
		}
		else
		{
			_pData=new char[strlen(mstr._pData)+1];
			strcpy(_pData,mstr._pData);
		}
	}
	//第二種寫法
	MyString(const MyString &mstr)
		:_pData(new char[strlen(mstr._pData)+1])
	{
		strcpy(_pData,mstr._pData);
	}
	//第三種寫法:只有在構(gòu)造和析構(gòu)的時(shí)候開辟和釋放空間,內(nèi)存空間不易出錯(cuò)
	//不會(huì)出現(xiàn)MyString實(shí)例化對(duì)象的錯(cuò)誤,考慮到了異常安全性
	MyString(const MyString &mstr)
		:_pData(NULL)
		//_pData沒有初始化,隨機(jī)的空間,如果不賦值為空,會(huì)delete失敗
	{
		MyString temp(mstr._pData);
		swap(temp._pData,_pData);
	}
	//賦值運(yùn)算符重載
	//考點(diǎn):1、返回值是該類型引用(考慮到有連等情況a=b=c)
	//考點(diǎn):2、形參是const 引用(不會(huì)改變形參并且效率高)
	//第一種寫法--->缺點(diǎn):如果在new char[]出錯(cuò)的話,很有可能_pData就變成野指針
	//那么MyString返回的對(duì)象就是一個(gè)不正確的對(duì)象,有異常安全性問題
	MyString& operator=(const MyString &mstr)
	{
		//考點(diǎn):3、自己給自己賦值的情況,有沒有考慮到!
		if (this!=&mstr)
		{
			//考點(diǎn):4、先釋放,一定是釋放[]_pData,原因就是構(gòu)造的方式
			delete []_pData;
			//再開辟
			_pData=new char[strlen(mstr._pData)+1];
			strcpy(_pData,mstr._pData);
		}
		return *this;
	}
	//第二種寫法
	MyString &operator=(const MyString &mstr)
	{
		//先開辟
		char *temp=new char[strlen(mstr._pData)+1];
		if (temp==NULL)
		{
			return *this;
		}
		//在釋放
		delete []_pData;
		_pData=temp;
		strcpy(_pData,mstr._pData);
		return *this;
	}
	//第三種寫法
	MyString &operator=(MyString mstr)
	{
	        swap(mstr._pData,_pData);
		return *this;
	}
	//更優(yōu)寫法
	MyString &operator=(const MyString &mstr)
	{
	    if(&mstr!=this)
	    {
	        MyString temp(mstr._pData);
	        swap(temp._pData,_pData);
	    }
	    return *this;
	}
	//String對(duì)象轉(zhuǎn)換成const char*
	const char* C_str()const
	{
		return _pData;
	}
	//求字符串長(zhǎng)度
	size_t Size()
	{
		return strlen(_pData);
	}
	//判斷是否相等
	bool operator==(const MyString &mstr)const
	{
		if (&mstr!=this)
		{
			if(!strcmp(_pData,mstr._pData))
			{
				return false;
			}
		}
		return true;
	}
	//某個(gè)字符
	char operator[](size_t pos)const
	{
		if (pos<strlen(_pData)&&pos>=0)
		{
			return _pData[pos];
		}
		else
		{
			return 0;
		}
	}
	//字符串比較
	int operator<(const MyString &mstr)const
	{
		int truth=strcmp(_pData,mstr._pData);
		if (truth>0)
		{
			return -1;
		}
		else if (truth==0)
		{
			return 0;
		}
		else
		{
			return 1;
		}
	}
	
};

創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國(guó)云服務(wù)器,動(dòng)態(tài)BGP最優(yōu)骨干路由自動(dòng)選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動(dòng)現(xiàn)已開啟,新人活動(dòng)云服務(wù)器買多久送多久。

網(wǎng)頁題目:c++中有關(guān)自定義string的那些為什么-創(chuàng)新互聯(lián)
分享鏈接:http://aaarwkj.com/article42/dgojec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、營(yíng)銷型網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、小程序開發(fā)、品牌網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)
日本经典三级视频在线观看| 亚洲中文字幕高清无二区| 丰满人妻被猛烈进入中文版| 未满十八禁在线观看免费| 国产一区二区日韩一区| 日韩欧美亚洲一区二区三区 | 91亚洲精品综合久久| 中文字幕国产精品综合| 禁止未满十八在线观看| 偷拍视频一区二区三区| 一区二区三区欧美小黄片| 天堂av中文字幕在线不卡| 亚洲精品中文字幕码专区| 日本黄色免费在线观看网站| 欧美日韩综合人妻丝袜偷拍| 国产乱国产乱老熟女视频| 国产传媒视频在线观看| 密臀av一区二区三区| 一级欧美黄片在线播放| 日本国产一区二区三区在线观看| 俄罗斯少妇毛茸茸的高潮| 国产丝袜在线福利观看| 在线观看日韩精品电影| 日韩精品一区二区三区中文| 成人精品欧美欧美一级乱黄| 亚洲社区一区二区三区四区| 亚洲成人精品夫妻av| 久久精品久久久精品| 久久精品国产亚洲av不丁香| 无遮挡动漫网站免费观看| 日本一区二区三区免费看视频| 久久国产麻豆精品电影| 中文字幕日韩在线欧美一区| 日韩黄色一级片在线观看| 欧美成人黄色免费在线网站| 日本午夜熟女九色视频| 欧美日韩精品人妻中文| 视频二区国产欧美日韩| 天天躁人人躁夜夜躁狠狠躁| 国内成人午夜激情视频| 一本综合九九国产二区|