首先通過乙個例子引出自我賦值可能會導致的問題,例子如下:
1由於widget類包含動態分配物件的指標,因而需要自定義拷貝建構函式和賦值符函式.class
bitmap ;
2class
widget ;
10 widget& widget::operator=(const widget& rhs) //
乙份不安全的operator=實現版本
11
在上述operator=函式中,如果*this(賦值的目的端)和rhs是同乙個物件,將會導致*this物件裡的pb指標指向乙個已被刪除的物件.
通過在operator=中增加乙個證同測試,可以阻止這種錯誤.**實現如下:
1 widget& widget::operator=(const widget&rhs)雖然增加證同測試後,可以達到自我賦值的安全性,但不具備異常安全性.2
如果"new bitmap"導致異常,widget最終會持有乙個指標指向一塊被刪除的bitmap.
這樣的指標有害,我們無法安全地刪除它們,甚至無法安全地讀取它們.
通過合理安排語句,可以實現異常安全的**.**實現如下:
1 widget& widget::operator=(const widget&rhs)如果"new bitmap"丟擲異常,pb會保持原狀.2
即使沒有證測試,上述**還是能夠處理自我賦值.
此外,還有一種方法copy and swap技術可以實現operator=函式的異常安全和自我賦值安全.**實現如下:
1 widget& widget::operator=(const widget&rhs)上述**中,第3行**建立臨時變數temp,作為rhs資料的乙份復件.2
由於swap函式會交換*this和引數物件的資料,如果直接將rhs作為引數,則會改變rhs物件的值,與operator=的操作不符.
我們可以將operator=函式宣告為"以by value方式接受實參",這樣可減少臨時變數temp的建立.
將"copying動作"從函式本體移至"函式引數構造階段".**如下:
1 widget& widget::operator=(widget rhs) //pass by value,rhs是被傳物件的乙份復件
2
C 問題集(自我積累)
1.如何實現輸入是0.0 就跳出迴圈?答 while scanf lf d d 0 不滿足輸入結束就進入處理迴圈,否則程式結束 備註 while scanf d d a,b a 0 b 0 2.eof什麼意思?答 scanf 的返回值是讀入變數的個數,如果沒有讀到數,返回值是 1,也就是 eof。2...
在operator 中處理自我賦值
自我賦值發生在 widget a a a 上面這種情況一般不會發生。但是如果 b i b j p1 p2i j 或者 p1和p2指向同乙個物件 自我賦值就發生了 class widget private bitmap pb 傳統的方法是借由operator 最前面的乙個認同測試 class widg...
11 在 operator 中處理「自我賦值」
確定任何函式如果操作乙個以上的物件,而其中多個物件是同乙個物件時,其行為仍然正確。自我賦值 很容易被使用,雖然沒有意義,但若不加以 處理會造成系統報錯。法 1 傳統做法 在 operator 裡做乙個 證同測試 identity test 達到 自我賦值 的檢測目的。widget widget op...