條款11 在operator 中處理「自我賦值」

2021-10-04 01:27:38 字數 693 閱讀 9507

存在的問題:

在類的賦值運算子函式中,需要安全處理自我賦值問題,即:

//.cpp

classa a1;

a1 = a1;

//自我賦值

處理方法:為阻止這種現象,有三種方法:

方法1:證同測試:

a& a::

operator=(

const a& a)

證同測試具備自我賦值安全,但不具備異常安全,即由於new出現的問題,不能解決。

方法2:安排語句順序,複製後再刪除指標:

a& a::

operator=(

const a& a)

此方法具備異常安全同時具備自我賦值安全,但效率低,因為每次都要進行複製。

方法3:copy-and-swap技術:

條款29詳細說明

//.h

class a

;//.cpp

a& a::

operator=(

const a& a)

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

條款11 在operator 中處理「自我賦值」

自行管理資源時,可能在停止使用資源之前意外釋放了它。class data class widget widget widget operator const widget rw operator 函式內的 this和rw可能是同一物件,結果就是widget物件持有乙個指標指向一塊已被刪除的data。...