在operator 中處理自我賦值

2021-07-05 12:38:49 字數 939 閱讀 7368

自我賦值發生在

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是同乙個...