C++法則3:使用拷貝和交換的賦值運算符自動就是異常安全的,且能正確處理自賦值。
這條法則強調了使用"拷貝和交換"(Copy-and-Swap)慣用法來實現賦值運算符(=)的優點:
關鍵點
-
異常安全:拷貝和交換方法天然提供了強異常安全保證,因為在修改左側對象之前,所有操作都已完成。
-
自賦值安全:這種方法自動正確處理自賦值情況(如
x = x
),不需要顯式檢查。 -
代碼復用:它利用了拷貝構造函數和swap函數的已有實現,避免了代碼重復。
典型實現
(1)
//注意rhs是按值傳遞的,意味著HasPtr持拷貝構造函數//將右側運算符對象中的string拷貝到rhsHasPtr& HasPtr::operator=(HasPtr rhs){//交換左側運算對象和局部變量rhs的內容swap(*this,rhs); //rhs現在是指向本對象曾經使用的內存return *this; //rhs被銷毀,從而delete了rhs中的指針}
(2)
???????class MyClass {
public:// 拷貝賦值運算符MyClass& operator=(MyClass other) { // 注意:參數是按值傳遞swap(*this, other);return *this;}// 交換函數friend void swap(MyClass& first, MyClass& second) noexcept {using std::swap;// 交換所有成員swap(first.data, second.data);// ... 其他成員的交換}
};
工作原理
-
參數是按值傳遞的,這會調用拷貝構造函數創建臨時副本
-
然后與當前對象交換內容
-
臨時對象在函數結束時銷毀,帶走原內容
優勢
-
簡潔且不易出錯
-
自動獲得異常安全性
-
正確處理自賦值
-
與移動語義自然配合(C++11及以上)
這種方法遵循了DRY(Don't Repeat Yourself)原則,減少了代碼重復和潛在錯誤。