自我賦值發生在
widget a
;//.......
a = a
;
上面這種情況一般不會發生。。
但是如果
b[i] = b[j];
*p1 = *p2
i == j 或者 p1和p2指向同乙個物件
自我賦值就發生了
class widget
private:
bitmap * pb;
};
傳統的方法是借由operator=最前面的乙個認同測試
class widget
private:
bitmap * pb;
};
但是如果new導致異常(記憶體分配不足或者bitmap的copy建構函式丟擲異常),widget最終會指向一塊被刪除的bitmap
widget &operator = (const widget& c)
這樣,如果new bitmap丟擲異常,pb能夠保持原狀,而且也可以解決自我賦值
另一種實現方法
void swap(widget &rhs){}//交換*this和rhs的資料
widget &operator = (const widget& c)
上一種**優化
void swap(widget &rhs){}//交換*this和rhs的資料
widget &operator = (widget temp)
作者認為這樣雖然犧牲了清晰性
但那時將copying動作移至『函式引數構造階段』卻可以令編譯器有時生成更高效的**
11 在 operator 中處理「自我賦值」
確定任何函式如果操作乙個以上的物件,而其中多個物件是同乙個物件時,其行為仍然正確。自我賦值 很容易被使用,雖然沒有意義,但若不加以 處理會造成系統報錯。法 1 傳統做法 在 operator 裡做乙個 證同測試 identity test 達到 自我賦值 的檢測目的。widget widget op...
條款11 在operator 中處理「自我賦值」
結論1 確保當物件自我賦值時operator 有良好行為,其中技術包括比較 物件 和 目標物件 的位址 證同測試 精心周到的語句順序 以及copy and swap。例如 class bitmap class widget 證同測試 widget widget operator const widg...
條款11 在operator 中處理」自我賦值「
一 有別名的存在,所以有可能自我賦值。下面的 不具備自我賦值的安全性 也不具備 異常安全性 class bitmap class widget widget widget operator const widget rhs 自我賦值的話,呼叫的物件和傳入的引數是同乙個物件,this 跟rhs是同乙個...