String的實(shí)現(xiàn)涉及很多C++的基礎(chǔ)知識(shí)、內(nèi)存控制及異常處理等問(wèn)題,仔細(xì)研究起來(lái)非常復(fù)雜,本文主要做一個(gè)簡(jiǎn)單的總結(jié)和歸納。
一、整體框架
面試時(shí)由于時(shí)間關(guān)系,面試官一般不會(huì)要求很詳盡的String的功能,一般是要求實(shí)現(xiàn)構(gòu)造函數(shù)、拷貝構(gòu)造函數(shù)、賦值函數(shù)、析構(gòu)函數(shù)這幾個(gè)非常重要的部分。因?yàn)镾tring里涉及動(dòng)態(tài)內(nèi)存的管理,默認(rèn)的拷貝構(gòu)造函數(shù)在運(yùn)行時(shí)只會(huì)進(jìn)行淺復(fù)制,即只復(fù)制內(nèi)存區(qū)域的指針,會(huì)造成兩個(gè)對(duì)象指向同一塊內(nèi)存區(qū)域的現(xiàn)象。如果一個(gè)對(duì)象銷毀或改變了該內(nèi)存區(qū)域,會(huì)造成另一個(gè)對(duì)象運(yùn)行或者邏輯上出錯(cuò)。這時(shí)就要求程序員自己實(shí)現(xiàn)這些函數(shù)進(jìn)行深復(fù)制,即不止復(fù)制指針,需要連同內(nèi)存的內(nèi)容一起復(fù)制。
除了以上四個(gè)必須的函數(shù),這里還實(shí)現(xiàn)了一些附加的內(nèi)容。
1.若干個(gè)運(yùn)算符重載,這里的幾個(gè)是常見(jiàn)的運(yùn)算符,可以加深對(duì)String的認(rèn)識(shí)和運(yùn)算符重載的理解。
2.兩個(gè)常用的函數(shù),包括取字符串長(zhǎng)度和取C類型的字符串。
3.兩個(gè)處理輸入輸出的運(yùn)算符重載,為了使用的方便,這里把這兩個(gè)運(yùn)算符定義為友元函數(shù)。
整體的類的框架如下所示。
class String
{
public:
String(const char *str = NULL); //通用構(gòu)造函數(shù)
String(const String &str); //拷貝構(gòu)造函數(shù)
~String(); //析構(gòu)函數(shù)
String operator+(const String &str) const; //重載+
String& operator=(const String &str); //重載=
String& operator+=(const String &str); //重載+=
bool operator==(const String &str) const; //重載==
char& operator[](int n) const; //重載[]
size_t size() const; //獲取長(zhǎng)度
const char* c_str() const; //獲取C字符串
friend istream& operator>>(istream &is, String &str);//輸入
friend ostream& operator<<(ostream &os, String &str);//輸出
private:
char *data; //字符串
size_t length; //長(zhǎng)度
};
注意,類的成員函數(shù)中,有一些是加了const修飾的,表示這個(gè)函數(shù)不會(huì)對(duì)類的成員進(jìn)行任何修改。一些函數(shù)的輸入?yún)?shù)也加了const修飾,表示該函數(shù)不會(huì)對(duì)改變這個(gè)參數(shù)的值。
二、具體實(shí)現(xiàn)
下面逐個(gè)進(jìn)行成員函數(shù)的實(shí)現(xiàn)。
同樣構(gòu)造函數(shù)適用一個(gè)字符串?dāng)?shù)組進(jìn)行String的初始化,默認(rèn)的字符串?dāng)?shù)組為空。這里的函數(shù)定義中不需要再定義參數(shù)的默認(rèn)值,因?yàn)樵陬愔幸呀?jīng)聲明過(guò)了。另外,適用C函數(shù)strlen的時(shí)候需要注意字符串參數(shù)是否為空,對(duì)空指針調(diào)用strlen會(huì)引發(fā)內(nèi)存錯(cuò)誤。
String::String(const char *str)//通用構(gòu)造函數(shù)
{
if (!str)
{
length = 0;
data = new char[1];
*data = '亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区