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類中的成員如下所示:
cpysgxly
xftcefua
fwtrlmym
vmcgolgu
ymulhaos
ddomsddo
fedcqube
13.string類的主要實現class
string227
char *c_str()
2829 friend istream &operator>>(istream &cin, string &str);
30 friend ostream &operator
<
31private:32
int_size;
33char *_string;
34 };
我們先來說一下建構函式的實現。由於我想實現的string類中存放字元的陣列大小是可以根據實際需要存放字元的個數來動態調整的(這樣對於存放字元的個數就沒有限制,除非記憶體不夠用了),所以必須根據實際存放的字元個數來動態的申請記憶體空間,**可以用如下的方式實現:
由於建構函式動態申請了記憶體,所以必須定義析構函式來釋放我們申請的記憶體空間。
同樣,由於我們每個string類都會動態的申請記憶體空間,所以必須定義拷貝建構函式,否則預設的拷貝建構函式會導致多個string物件共享相同記憶體空間的問題(深拷貝與淺拷貝的的問題)。**和前面的建構函式差不多。
其它的函式就是對+,=,+=操作符的過載,原理都是一樣的,需要重新分配記憶體空間來適應新的字串個數的需求,不同的是+的返回型別不需要使用引用。具體
**如下:
還有我們經常用的是直接對string類進行輸出,所以我們必須過載<>操作符,由於輸入和輸出都需要用到string類中的私有成員變數_string,所以應該把這兩個函式設定為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...