實現乙個string類

2022-04-10 11:45:28 字數 1218 閱讀 7815

需要實現的基本功能:建構函式、拷貝建構函式、賦值函式、析構函式. (以前合稱big three, 現在叫做copy control)

1

class

string ;

1213

/*不簡潔版本

14string::string(const char* str) else 23}

24*/

2526 string::string(const

char*str)

3031 string::~string()

3435 string::string(const string&rhs)

3940

//bad version

41 string& string::operator=(const string&rhs)

47return *this;48

}4950 size_t string::size() const

5354

const

char* string::c_str const

()

上面的拷貝建構函式有個潛在隱患:string類涉及到記憶體分配操作,這個new操作可能會丟擲異常。

解決方法:

可以通過」copy and swap「的策略來實現。其原理很簡單:即先對打算修改的物件做出乙個副本(copy),在副本上做必要的修改。如果生成副本時出現任何異常,原物件依然能保證不變。如果修改成功,則通過不丟擲任何異常的swap函式將副本和原物件進行交換(swap)。[ ref ]

1 string& string::operator=(const string &rhs)

如果把引數中的引用傳遞換成值傳遞,那就相當於自動建立出乙個臨時物件來。如下是另一種等價形式。

1 string& string::operator=(string rhs)

在swap之後,相當於兩指標指向的記憶體區域進行了互換。當退出函式時,tmp生命週期已到,將被銷毀,但是它銷毀時釋放的是交換後的記憶體區域,即原來的data所指的記憶體區域;它本來指向的記憶體區域現在歸data管了,不會被釋放。

ref2和ref5都考慮了異常安全的問題。

ref:

1. 《高質量c/c++程式設計指南》附錄a,b (可能有錯誤)

2. 3. 

4. 5. 

乙個string類的簡單實現

string類中使用到了賦值建構函式 複製建構函式 建構函式 預設建構函式 析構函式 過載操作符等一些類操作 class string string const char str string const char str,int n string const string src 拷貝建構函式 也...

如何實現乙個string類 1

string類是c 當中用的非常頻繁的乙個類,它提供了很多處理字串的函式,讓字串的使用變得像int float等built in型別一樣簡單。string類的實現包含了大量c 語言的知識,其中有很多值得討論的問題。自己動手實現乙個string類是學習c 語言的好方法,可以檢驗自己一下c 基礎知識掌握...

如何實現乙個string類 2

首先來看一下賦值運算子過載。在實際應用中,我們經常遇到需要將乙個物件賦值給另外乙個物件的情況,那麼就需要使用賦值運算子 跟預設的拷貝建構函式一樣,如果我們沒有顯式地定義乙個賦值運算子過載函式,那麼編譯器會提供乙個預設的函式實現賦值功能。大暖男再次出場,不出意外地再次不靠譜。編譯器提供的賦值運算函式只...