国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

【面試題】劍指offer-1-賦值運算符重載

2019-11-06 06:02:38
字體:
來源:轉載
供稿:網友

題目:為String類實現賦值運算符重載

這里直接實現深拷貝的String類

#PRagma once#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;//面試題1:賦值運算符函數//模擬實現Stringclass String{public:	//構造函數	String(const char* _pStr = "")	{		if (_pStr == NULL)		{			pstr = new char[1];			*pstr = '/0';		}		else		{			pstr = new char[strlen(_pStr) + 1];			strcpy(pstr, _pStr);		}	}	//拷貝構造函數	//String(String s) 這種是錯誤的寫法,會導致無限遞歸調用	String(const String &s)	{		//如果不是自身拷貝		if (this != &s)		{			delete[] pstr;			pstr = new char[strlen(s.pstr)];			strcpy(pstr, s.pstr);		}	}	//注意點1:返回值為String的引用,保證了其可以連續賦值	//注意點2:穿入參數為s的引用,減少其調用拷貝構造函數而造成的開銷	//注意點3:記得用delete釋放申請的空間,防止出現內存泄漏	//注意點4:是否判斷傳入的參數和自身是否為同一個實例	//注意點5:中間采用了臨時變量tmp。如果不用tmp,先釋放了原來的空間;如果此時由于	//       內存不足而導致new不出來拋出異常時,pstr便成了一個空指針	//解決方法1:申請char*的臨時變量,釋放后賦值給pstr	/*String& Operator=(const String&s)	{		if (&s != this)		{			char* tmp = new char[strlen(s.pstr)+1];			strcpy(tmp, s.pstr);			delete[] pstr;			pstr = tmp;		}		return *this;	}*/	//解決方法2:構造出一個新的變量,將其和this進行交換	//調用了一次構造函數和一次析構函數	/*String& operator=(const String&s)	{		if (this != &s)		{			String tmp(s.pstr);			std::swap(pstr, tmp.pstr);		}		return *this;	}*/	//解決方法3:進行值傳入,直接交換	//調用了一次拷貝構造函數和一次析構函數	String& operator=(String s)	{		std::swap(pstr, s.pstr);	}	//注意點:釋放空指針不會導致出錯,但空間不允許釋放多次	~String()	{		if (pstr != NULL)		{			delete[] pstr;			pstr = NULL;		}	}protected:	char* pstr;};

注意點總結:

1、返回值為String的引用,保證了其可以連續賦值

2、穿入參數為s的引用,減少其調用拷貝構造函數而造成的開銷

3、記得用delete釋放申請的空間,防止出現內存泄漏

4、是否判斷傳入的參數和自身是否為同一個實例

5、中間采用了臨時變量tmp。如果不用tmp,先釋放了原來的空間;如果此時由于內存不足而導致new不出來拋出異常時,pstr便成了一個空指針


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海原县| 襄汾县| 寿阳县| 安西县| 达日县| 宿松县| 五常市| 田阳县| 藁城市| 同江市| 曲靖市| 辛集市| 秦皇岛市| 垦利县| 和硕县| 沙雅县| 都匀市| 罗山县| 三门峡市| 高平市| 新巴尔虎右旗| 南京市| 福鼎市| 建瓯市| 永清县| 理塘县| 宾阳县| 长兴县| 霞浦县| 鹰潭市| 河池市| 万山特区| 宜兰市| 讷河市| 巍山| 托里县| 乐平市| 镇巴县| 乌鲁木齐市| 濮阳市| 垦利县|