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賦值過程中,等號實...