自己實現簡單的string類

2022-07-09 21:51:13 字數 2442 閱讀 2881

1.前言

最近看了下《c++primer》,覺得受益匪淺。不過紙上得來終覺淺,覺知此事須躬行。今天看了類型別,書中簡單實現了string類,自己以前也學過c++,不過說來慚愧,以前都是用c來寫程式,學的c++基本都忘記了,也說明自己以前對c++的理解不夠深入。基於這些,覺得有必要動手來寫寫c++的一些程式了,畢竟c++有很多的功能是c所不具備的。正好看了課本中string類的簡單實現,而且string類在c++中的使用頻率也很高,了解其內部的實現是很有必要的。所以今天打算寫個string類,就當做練手吧。

2.string類的設計

寫類首先是定義類的名字,我們實現的string就叫string吧,以防和標準庫中的string類衝突。其次是類中的內部資料,既然是字串類,必須要把字串類所代表的字串儲存起來,所以必須定義乙個存放這些字元的字元陣列或者乙個指向字元陣列的指標。我是用後者實現,因為這樣更為的靈活,不會因為提前定義陣列的大小而限制了能存放到陣列中的字元個數。為了方便,可以定義字串的長度,當然也可以不定義,可以在字元陣列的末尾存放0來表示字串的結束,不過每次得到字串的長度比較麻煩。最後是類對外的介面,根據我們平時使用string類的情況,我們一般會用到介面size(), c_str(),還有就是+,=,>>,<

根據前面的分析,可以得到我們要設計的string類中的成員如下所示:

1

class

string228

char *c_str()

2930 friend istream &operator>>(istream &cin, string &str);

31private:32

int_size;

33char *_string;

34 };

3.string類的主要實現

我們先來說一下建構函式的實現。由於我想實現的string類中存放字元的陣列大小是可以根據實際需要存放字元的個數來動態調整的(這樣對於存放字元的個數就沒有限制,除非記憶體不夠用了),所以必須根據實際存放的字元個數來動態的申請記憶體空間,**可以用如下的方式實現:

1 string::string(const

char *str)28

else

915 }

view code

由於建構函式動態申請了記憶體,所以必須定義析構函式來釋放我們申請的記憶體空間。

1 string::~string()

2

view code

同樣,由於我們每個string類都會動態的申請記憶體空間,所以必須定義拷貝建構函式,否則預設的拷貝建構函式會導致多個string物件共享相同記憶體空間的問題(深拷貝與淺拷貝的的問題)。**和前面的建構函式差不多。

1 string::string(const string &str)28

else915

16 }

view code

其它的函式就是對+,=,+=操作符的過載,原理都是一樣的,需要重新分配記憶體空間來適應新的字串個數的需求,不同的是+的返回型別不需要使用引用。具體

**如下(用+=實現的):

string string::operator+(const string &str)

view code

由於函式+會返回物件,編譯器會預設產生乙個臨時的物件,這個物件完全是返回物件的拷貝,而返回物件馬上就會析構掉,所以如果我們能把返回物件中的字元陣列位址拷貝到臨時物件中,那麼臨時物件就可以不用再申請記憶體了,這樣可以提供效率。所以這裡我實現了乙個move函式( tangzhnju

string::string(string &&str)

view code

還有我們經常用的是直接對string類進行輸出,所以我們必須過載<>操作符,由於輸入需要用到string類中的私有成員變數_string,所以應該把輸入函式設定為string類的友元函式。而輸出可以通過呼叫c_str函式獲得字元陣列位址來輸出。

istream &operator>>(istream &cin, string &str)

ostream &operator

<

view code

編寫這個string類遇到了兩個小的問題,乙個就是在寫+=操作符過載函式的時候,忘記在函式的前面寫string::,導致編譯器總是包各種莫名的錯誤,什麼引數不對,不能訪問內部成員,這個問題完全是自己粗心導致的。另乙個問題就是寫+操作符過載函式,開始寫+函式的時候直接修改了當前的string物件,後來測試發現這是有問題的,因為+應該重新返回乙個新的string物件,這個新string物件是當前string物件與傳入引數的字串的和,這個問題完全是自己沒有想清楚+與+=的區別,+=才是要修改當前string物件的。

附加:string類實現**

自己實現簡單的string類

1.前言 最近看了下 c primer 覺得受益匪淺。不過紙上得來終覺淺,覺知此事須躬行。今天看了類型別,書中簡單實現了string類,自己以前也學過c 不過說來慚愧,以前都是用c來寫程式,學的c 基本都忘記了,也說明自己以前對c 的理解不夠深入。基於這些,覺得有必要動手來寫寫c 的一些程式了,畢竟...

自己實現簡單的string類

1.前言 最近看了下 c primer 覺得受益匪淺。不過紙上得來終覺淺,覺知此事須躬行。今天看了類型別,書中簡單實現了string類,自己以前也學過c 不過說來慚愧,以前都是用c來寫程式,學的c 基本都忘記了,也說明自己以前對c 的理解不夠深入。基於這些,覺得有必要動手來寫寫c 的一些程式了,畢竟...

string類的簡單實現

include class string string string const char ch else string string const string str string string string string operator const string str string stri...