如下為型別cmystring的宣告,要求為該型別新增賦值運算子函式。
class cmystring
;
這道題主要考察c++基礎語法如運算子函式、常量引用等,另外需要注意記憶體洩漏和**異常安全性。給出具體**,**中需要注意的地方都有備註。
#include#includeusing namespace std;
// class instance assignment operation
class cmystring
;cmystring::cmystring(char* pdata)
else
}cmystring::cmystring(const cmystring &str)
cmystring::~cmystring()
/*1、返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用(*this)。只有返回乙個引用
才可以連續賦值,如果函式的返回值是 void,則應用該賦值預算符將不能進行連續賦值。
2、傳入的引數的型別宣告為常量引用,如果傳入的引數不是引用而是例項,那麼形參到實參會呼叫一次複製建構函式,
把引數宣告為引用可以避免這樣的無謂消耗,提高**的效率。同時,我們在賦值運算子函式內不會改變傳入的例項的狀態
因此應該為傳入的引用引數加上 const 關鍵字
3、是否釋放例項自身已有的記憶體,如果我們忘記再分配新記憶體之前釋放自身已有的記憶體,則程式將出現記憶體洩漏。
4、判斷傳入的引數和當前的例項(*this)是不是同乙個例項。如果是同乙個則不進行賦值操作直接返回。如果事先
沒有進行判斷就進行賦值,在釋放例項自身的記憶體時就會導致嚴重的問題,當*this 和傳入的引數是同乙個例項時,
一旦釋放了自身的記憶體,傳入引數的記憶體也同時被釋放了,因此再也找不到需要賦值的內容了。
*/cmystring& cmystring::operator = (const cmystring& str)
/*// another way to do this, use intermediate instance。
cmystring& cmystring::operator = (const cmystring& str)
return *this;}*/
void cmystring::print()
void test1()
void test2()
void test3()
int main(int argc, char* ar**)
其中,在注釋部分的賦值運算子函式是最理想的實現方式,它考慮到了記憶體不足導致 new char 丟擲異常的情況,符合異常安全性原則。如果是在分配記憶體前用 delete 釋放了例項 m_pdata的記憶體,若記憶體不足導致 new char 丟擲異常,則 m_pdata將是乙個空指標,這會導致程式崩潰。也就是說,一旦在賦值運演算法函式內部丟擲乙個異常,cmystring的例項不再保持有效的狀態,這就違背了異常安全性原則。
要想在賦值運算子函式中實現異常安全性,有兩種方法。
(1)先用new分配新記憶體,然後再用delete釋放已有的內容,這樣只在分配內容成功之後再釋放原來
的內容,也就是當分配記憶體失敗時我們能確保cmystring的例項不會被修改
(2)**中注釋起來的部分。可以先建立乙個臨時例項,再交換臨時例項和原來的例項。
C 賦值運算子函式
型別中的賦值運算子函式的設計需要考慮以下幾點 把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 保證連續賦值 把傳入的引數的型別宣告為常量引用 避免呼叫拷貝建構函式 在拷貝賦值運算子函式中,如果不改變引數的狀態,則設定 const 關鍵字。釋放自身已有的動態分配的記憶體 防止記憶體...
賦值運算子函式
賦值運算子函式的 需要關注幾點 1 是否把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用 即 this 只有返回乙個引用,才可以允許連續賦值。否則如果函式的返回值void,該賦值運算子將不能做連續賦值。2 是否把傳入的引數的型別宣告為常量引用。引數宣告為引用可以避免無謂的消耗,提高...
賦值運算子函式
題目 如下為型別cmystring的宣告,請為該型別新增賦值運算子函式。class cmystring 1 經典解法,初級程式設計師 cmystring cmystring operator const cmystring str 2 考慮異常安全的解法,高階程式設計師 cmystring cmys...