Effective C++ 第十一條 Handle assignment to self in operator = .
在 operator= 中處理 “自我賦值?”
????????在編程的時候,賦值操作非常常見,但是有時候可能會出現(xiàn)自己的值賦給自己,當然這個也沒有問題,但是在 C++ 的 operator= 中不同的程序員存在不同的代碼習慣,其中一些就會造成錯誤。

這個時候你能一眼發(fā)現(xiàn)這里面的多余,但是代碼還是正確的,只是看起來不太聰明。有的時候就不容易看出來了

當 i = j?的時候,很難事先想到,即使出了問題也很難被發(fā)現(xiàn)。
????????下面列舉幾種情況并分析它是否正確以及如果錯誤會出現(xiàn)什么錯誤。

case 1 這種情況大多數(shù)時候不會出錯,現(xiàn)在假設 rhs 和 *this 是同一個對象,那么 delete pd;會將本對象中的資源 pd 釋放掉,然后的 new Bitmap 操作就會出錯,因為 *rhs.pb 已經(jīng)被釋放掉了,無法被取值復制了。我們可以增加一個認證測試,當且僅當 rhs 不是和本對象相同的時候才賦值。

case 2 增加了一個 if 判斷,可以解決這個問題,但是如果學過計算機組成原理中流水線的知識,就清楚的知道如果增加了一個 if 判斷,流水線吞吐率會下降,如果 PC 預測錯誤造成的錯誤懲罰會很大。

case 3 提供了一種思路,先把 rhs 的內(nèi)容復制一份為 temp ,temp 是為臨時對象,temp 和 *this 交換內(nèi)容之后,函數(shù)返回,又因為 temp 是臨時對象,函數(shù)結束,temp 自動被釋放。

case 4 思路和 case 3 一模一樣,只是實現(xiàn)方式有所有不同。如果不清楚 by value 和 by reference 的區(qū)別請繼續(xù)看,如果清楚就不需要再往后看了。
by value 和 by reference

現(xiàn)在有三個 OP 操作,直接傳入一個對象叫做 by value,傳引用和傳指針都叫做 by reference。區(qū)別如下。假設我現(xiàn)在有一瓶可樂,叫做 a,如果我把這個可樂作為參數(shù),通過傳對象的方式傳入,在函數(shù)內(nèi)部,其實并不會對可樂 a 進行操作,而是復制一瓶一模一樣的可樂 b,對可樂 b 進行操作。也就是說,我把 a 傳進去,在函數(shù)內(nèi)部我把可樂倒掉,其實倒掉的是 b,a還是完好無損,沒有改變。如果是 by reference,那么我傳入 a,那么在函數(shù)內(nèi)部操作的對象就是 a,而不是復制出來的一模一樣的 b。

輸出結果是 3 1 1