C++ 賦值運算子函式
阿新 • • 發佈:2019-01-07
型別中的賦值運算子函式的設計需要考慮以下幾點:
- 把返回值的型別宣告為該型別的引用,並在函式結束前返回例項自身的引用(保證連續賦值)。
- 把傳入的引數的型別宣告為常量引用(避免呼叫拷貝建構函式)。在拷貝賦值運算子函式中,如果不改變引數的狀態,則設定 const 關鍵字。
- 釋放自身已有的動態分配的記憶體(防止記憶體洩露)。
- 如果傳入引數和當前例項 *this 是同一個例項,則不進行賦值,直接返回。
- 保證異常安全性。動態記憶體分配可能會產生異常。
class MyClass {
public:
};
MyClass& MyClass::operator=(const MyClass& arg) { //拷貝賦值運算子函式
if (this == &arg)
return *this;
MyClass tmp(*this);
// TODO
// 將arg中的資料拷貝到this中
// 如果發生異常,將由tmp儲存的的資料移動回this的記憶體空間中
return *this;
} // 離開tmp的作用域,解構函式被自動呼叫
MyClass& MyClass::operator=(MyClass&& arg) { //移動賦值運算子函式
if (this == &arg)
return *this;
// 將arg中的資料移動到this的記憶體空間中
// 保證arg使用安全,如指標設定為nullptr
return *this;
}