Item 11 賦值函式的自賦值

2021-08-25 20:39:09 字數 620 閱讀 6514

class widget ; widget w; ... w = w; // 1. 能通過編譯,但是明顯不合理! ... a[i] = a[j]; // 2. ij可能相同 *px = *py; // 3. 二者可能相同或有繼承關係

上面的三種情況,都是給自己賦值,要在賦值時檢查。

class bitmap ; class widget ; // 既無賦值安全性,又無異常安全性的函式 widget& widget::operator=(const widget& rhs)

改正的辦法:

1> 檢查自賦值情況:

// 至少做到了賦值安全性 widget& widget::operator=(const widget& rhs)

如果想把 identity test 加上,那麼還要考慮自賦值的頻率。頻率小的話反而會降低效率,因為會影響cpu的prefetching、caching和pipelining。

3> copy and swap

class widget ; widget& widget::operator=(const widget& rhs)

有時為了優化效率,而採用傳值的方式:

widget& widget::operator=(widget rhs)

不檢測自賦值的危險???

為什麼在過載operator 時需要檢測自賦值情況呢?書上說是不檢測的話很危險,能不能舉例子說明?paris luo的意思是這樣 string operator const string src 在自賦值發生的時候,中的data和str.data其實是同乙個,那麼在第二句中就訪問了在第一句中已經釋放...

函式引數的解構賦值

函式的引數也可以使用解構賦值。function add x,y add 1 2 3 上面 中,函式add的引數表面上是乙個陣列,但在傳入引數的那一刻,陣列引數就被解構成變數x和y。對於函式內部的 來說,它們能感受到的引數就是x和y。下面是另乙個例子。1,2 3 4 map a,b a b 3,7 函...

C 中的賦值函式

test operator const test t return this void operator test t void main 1 形參中的test t 與test t 如上兩種賦值語句的寫法,本身都可以執行,沒有錯誤,但是其內部差異以及優缺點很明顯,如上述 t1給t2賦值過程中,等號實...