from:
string是c++中的重要型別,程式設計師在c++面試中經常會遇到關於string的細節問題,甚至要求當場實現這個類。只是由於時間關係,可能只要求實現建構函式、析構函式、拷貝建構函式等關鍵部分。
string的實現涉及很多c++的基礎知識、記憶體控制及異常處理等問題,仔細研究起來非常複雜,本文主要做乙個簡單的總結和歸納。
面試時由於時間關係,面試官一般不會要求很詳盡的string的功能,一般是要求實現建構函式、拷貝建構函式、賦值函式、析構函式這幾個非常重要的部分。因為string裡涉及動態記憶體的管理,預設的拷貝建構函式在執行時只會進行淺複製,即只複製記憶體區域的指標,會造成兩個物件指向同一塊記憶體區域的現象。如果乙個物件銷毀或改變了該記憶體區域,會造成另乙個物件執行或者邏輯上出錯。這時就要求程式設計師自己實現這些函式進行深複製,即不止複製指標,需要連同記憶體的內容一起複製。
除了以上四個必須的函式,這裡還實現了一些附加的內容。
整體的類的框架如下所示。
class string
;
注意,類的成員函式中,有一些是加了const修飾的,表示這個函式不會對類的成員進行任何修改。一些函式的輸入引數也加了const修飾,表示該函式不會對改變這個引數的值。
下面逐個進行成員函式的實現。
同樣建構函式適用乙個字串陣列進行string的初始化,預設的字串陣列為空。這裡的函式定義中不需要再定義引數的預設值,因為在類中已經宣告過了。
另外,適用c函式strlen的時候需要注意字串引數是否為空,對空指標呼叫strlen會引發記憶體錯誤。
string::string(const char *str)//通用建構函式
else
}
拷貝建構函式需要進行深複製。
string::string(const string &str)//拷貝建構函式
析構函式需要進行記憶體的釋放及長度的歸零。
string::~string()//析構函式
過載字串連線運算,這個運算會返回乙個新的字串。
string string::operator+(const string &str) const//過載+
過載字串賦值運算,這個運算會改變原有字串的值,為了避免記憶體洩露,這裡釋放了原先申請的記憶體再重新申請一塊適當大小的記憶體存放新的字串。
string& string::operator=(const string &str)//過載=
過載字串+=操作,總體上是以上兩個操作的結合。
string& string::operator+=(const string &str)//過載+=
過載相等關係運算,這裡定義為內聯函式加快執行速度。
inline bool string::operator==(const string &str) const//過載==
過載字串索引運算子,進行了乙個簡單的錯誤處理,當長度太大時自動讀取最後乙個字元。
inline char& string::operator(int n) const//過載
過載兩個讀取私有成員的函式,分別讀取長度和c字串。
inline size_t string::size() const//獲取長度
過載輸入運算子,先申請一塊足夠大的記憶體用來存放輸入字串,再進行新字串的生成。這是乙個比較簡單樸素的實現,網上很多直接is>>str.data的方法是錯誤的,因為不能確定str.data的大小和即將輸入的字串的大小關係。
istream& operator>>(istream &is, string &str)//輸入
過載輸出運算子,只需簡單地輸出字串的內容即可。注意為了實現形如cout《編碼完成後需要對**進行測試,以下是乙個簡單但不夠嚴謹的測試。
int main()
C 中String類的實現
include include using namespace std class string else 拷貝建構函式 開闢跟源字串長度一樣長的空間給目標物件 string string s pstr new char strlen s.pstr 1 賦值運算子的過載 因為考慮到連續賦值的情況,故...
C 中String類的實現
原文 string是c 中的重要型別,程式設計師在c 面試中經常會遇到關於string的細節問題,甚至要求當場實現這個類。只是由於時間關係,可能只要求實現建構函式 析構函式 拷貝建構函式等關鍵部分。string的實現涉及很多c 的基礎知識 記憶體控制及異常處理等問題,仔細研究起來非常複雜,本文主要做...
C 中String類的實現
原文 string是c 中的重要型別,程式設計師在c 面試中經常會遇到關於string的細節問題,甚至要求當場實現這個類。只是由於時間關係,可能只要求實現建構函式 析構函式 拷貝建構函式等關鍵部分。string的實現涉及很多c 的基礎知識 記憶體控制及異常處理等問題,仔細研究起來非常複雜,本文主要做...