[問題] operator=()內為何判斷物件是否等於this

看板C_and_CPP (C/C++)作者時間12年前 (2013/08/19 23:22), 編輯推噓7(7020)
留言27則, 10人參與, 最新討論串1/1
參考網頁http://openhome.cc/Gossip/CppGossip/CopyConstructorAndAssign.html // 重載=指定運算子 SafeArray& SafeArray::operator=(const SafeArray &safeArray) { // 這邊始終不懂,看了很多說明還是不知道判斷這行的用意是甚麼 if(this != &safeArray) { length = safeArray.length; // 先清除原有的資源 delete [] _array; _array = new int[safeArray.length]; for(int i = 0; i < safeArray.length; i++) { _array[i] = safeArray._array[i]; } } return *this; } 有請高手點一下 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 27.52.136.5

08/19 23:25, , 1F
避免自我指定: a = a;
08/19 23:25, 1F

08/19 23:25, , 2F
自我賦值檢定 不要讓 x = x; 出事
08/19 23:25, 2F

08/19 23:26, , 3F
使用者說不定會寫 自己 = 自己; (?)
08/19 23:26, 3F

08/19 23:26, , 4F
如果你沒檢查,自我賦值 (ex. a=a;) 會爆炸
08/19 23:26, 4F

08/19 23:26, , 5F
可以想像一下當這條式子成立時下面的所有式子會發生什麼事
08/19 23:26, 5F

08/19 23:27, , 6F
不過他這樣寫仍然不是exception safe就是了
08/19 23:27, 6F

08/19 23:34, , 7F
我看很多說明都是這樣寫 避免自我賦值 但是為什麼不行?
08/19 23:34, 7F

08/19 23:35, , 8F
A=A城市應該可以執行才對吧? 邏輯也沒 應該沒有這道理吧?
08/19 23:35, 8F

08/20 00:00, , 9F
a=b;如果是先清除a再將b複製給a,那a=a?
08/20 00:00, 9F

08/20 00:34, , 10F
delete []_array會把自己清掉 在賦值給自己 這樣會有問
08/20 00:34, 10F

08/20 00:34, , 11F
08/20 00:34, 11F

08/20 01:24, , 12F
copy-and-swap idiom 寫多了都會忽略這個 x) 但是要加
08/20 01:24, 12F

08/20 01:24, , 13F
lock
08/20 01:24, 13F

08/20 03:09, , 14F
我只能說這沒啥道理 就是經驗 XD 使用者很容易亂寫
08/20 03:09, 14F

08/20 03:10, , 15F
同一個變數兩個參考互相賦值的錯誤並不是真的很少見....
08/20 03:10, 15F
雖然他有DELETE 但是他有先NEW一個空間出來才賦值 delete [] _array; //事先刪掉在配置一個 //一般來說不是會有DEFAULT值嗎 //只是值會很怪而已吧 _array = new int[safeArray.length]; for(int i = 0; i < safeArray.length; i++) { _array[i] = safeArray._array[i]; } 這樣會有問題嗎 QQ 感謝前輩相助 ※ 編輯: kumusou 來自: 39.14.67.162 (08/20 19:52)

08/20 19:59, , 16F
自己assign給自己 a = a 那值不是應該不變嗎?
08/20 19:59, 16F

08/20 20:12, , 17F
阿你都說值會很怪了 那當然錯啊
08/20 20:12, 17F

08/20 23:00, , 18F
我自己嘗試了一下 賦值的確會有問題
08/20 23:00, 18F

08/20 23:00, , 19F
賦值錯了基本上就是個問題吧
08/20 23:00, 19F

08/20 23:40, , 20F
if(this != &safeArray) 避免多此一舉 沒必要設值給自己
08/20 23:40, 20F

08/20 23:42, , 21F
可改成)if(this == &safeArray){ return *this;}
08/20 23:42, 21F

08/20 23:50, , 22F
再者,要特別處理"指標變數"成員;因為this->_array每個元
08/20 23:50, 22F

08/20 23:52, , 23F
素的值要等於safeArray._array,必須用for逐一設值。
08/20 23:52, 23F

08/20 23:54, , 24F
還有,this->_array的長度可能與safeArray._array不同,必
08/20 23:54, 24F

08/20 23:56, , 25F
須先砍除this->_array陣列再new一次。
08/20 23:56, 25F

08/21 00:00, , 26F
if(this->length!=safeArray.length){ delete...; new...}
08/21 00:00, 26F

08/21 00:01, , 27F
也可以加個判斷式(如上所示)陣列同長度不必砍除再建。
08/21 00:01, 27F
文章代碼(AID): #1I4ZWY6B (C_and_CPP)
文章代碼(AID): #1I4ZWY6B (C_and_CPP)