Effective c++條款11:在operator=中處理“自我賦值”
目錄
1.不安全的operator=版本
class bitmap{
};
class widget{
widget& operator=(const widget& rhs){
delete pb;
pb = new bitmap(*rhs.pb);
return *this;
}
private:
bitmap* pb;
};
自我賦值的不安全:這裡的rhs物件如果和this指向的物件是同一個,那麼先進行了delete pb, 相當於給rhs.pb此時也指向了一塊已刪除的物件。這是不安全的。
異常不安全:這裡new操作,或bitmap的拷貝建構函式呼叫發生異常,那麼此時this->pb指向了一塊已刪除的物件。這也是不安全的。
2.安全的operator=版本
class bitmap{
};
class widget{
widget& operator=(const widget& rhs){
bitmap* tmp = pb;
pb = new bitmap(*rhs.pb);
delete tmp;
return *this;
}
private:
bitmap* pb;
};
這裡做了一個備份,並且在最後才刪除之前this->pb所指向的物件,所以可以處理自我賦值的不安全問題。而且即使此時new那一段語句丟擲異常,此時pb仍能保持原有的指向,解決了異常不安全問題。
注:copy與swap技術也能用來解決這種自我賦值與異常安全問題。
class bitmap{
};
class widget{
void swap(widget& rhs){
//交換
}
widget& operator=(const widget& rhs){
widget temp(rhs);
swap(temp);
return *this;
}
private:
bitmap* pb;
};
參考 《Effective c++》
相關文章
- 條款 11:在 operator= 中處理“自我賦值”賦值
- C++筆記 11:在operator中處理“自我賦值“C++筆記賦值
- More Effective C++ 條款11 (轉)C++
- More Effective C++ 條款28(中) (轉)C++
- More Effective C++ 條款4 (轉)C++
- More Effective C++ 條款19 (轉)C++
- More Effective C++ 條款6 (轉)C++
- More effective C++ 條款14 (轉)C++
- More Effective C++ 條款15 (轉)C++
- More Effective C++ 條款2 (轉)C++
- More Effective C++ 條款3 (轉)C++
- More effective C++ 條款13 (轉)C++
- More effective C++ 條款12 (轉)C++
- More Effective C++ 條款5 (轉)C++
- More Effective C++ 條款一 (轉)C++
- More Effective C++ 條款17 (轉)C++
- More Effective C++ 條款18 (轉)C++
- More Effective C++ 條款20 (轉)C++
- More Effective C++ 條款21 (轉)C++
- More Effective C++ 條款22 (轉)C++
- More Effective C++ 條款23 (轉)C++
- More Effective C++ 條款24 (轉)C++
- More Effective C++ 條款25 (轉)C++
- More Effective C++ 條款7 (轉)C++
- More Effective C++ 條款8 (轉)C++
- More effective c++ 條款10(上) (轉)C++
- More effective c++ 條款10(下) (轉)C++
- More Effective C++ 條款27(下) (轉)C++
- More Effective C++ 條款28(上) (轉)C++
- More Effective C++ 條款28(下) (轉)C++
- More Effective C++ 條款26(下) (轉)C++
- Effective Modern C++ 系列之 條款2: autoC++
- Effective C++ 條款08_不止於此C++
- 【c++】深賦值與淺賦值C++賦值
- (11)mysql 中的條件定義、處理MySql
- 《Effective C++》閱讀總結(二):類的構造、析構和賦值C++賦值
- [讀書筆記][effective C++]條款30-inline的原理筆記C++inline
- Oracle 在連線條件裡處理和比較 NULL 值OracleNull