作者ric2k1 (Ric)
看板EE_DSnP
標題[情報] Operator =
時間Tue Oct 19 23:46:29 2010
由於本題沒有要求大家去 overload "=" 這個 operator,所以同學們如果給了 main()
有可能會呼叫到 "="... 比方說:
>>>>>>>>>>>>>>>>>>>>>>>>>>>> QQ
這個問題是在和同學討論後所發現的
其實我們作業都已寫好,且若是用作業中所付的main程式測試則完全不會有問題
問題是出在若我們去變動main裡面的程式來作測試時
其中一種情況就是:
m1=m1+m2的情況
此種情況就會crash掉
其他還有譬如:
ans=m1+m2;
ans=m1*m3;
則這也會程式crash
<<<<<<<<<<<<<<<<<<<<<<<<<<< AA
m1 = m1 + m2;
會去呼叫 Matrix::operator =()
因為你沒有去 overload =,所以 compiler 會直接呼叫 default 的 = operator,也
就是做 member-wise 的 "=". 但是這樣會直接將 = 左邊 m1 + m2 的 temporary
object 的 _data pointer 直接 copy 給等號左邊 m1 的 _data pointer,但是 copy
完之後 right-hand-side 的 tmp obj 就不見了,接連影響 m1 的 _data 也會指向已
經被 freed 的 memory...
因為這個作業沒有要大家去 overload =,所以我們不會這樣測。
當然,你若有時間,也歡迎試試看 overload =,應該是不會太難,prototype 是:
Matrix& operator = (const Matrix& m) { ...; return *this; }
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 123.193.11.13
1F:推 BBSealion:預設main中那種=的寫法 是呼叫copy constructor 10/20 00:05
2F:→ BBSealion:來完成看似= operator 的動作 但實際上並沒有定義這個 10/20 00:05
3F:→ BBSealion:operator 是這樣嗎? 10/20 00:05
4F:→ ric2k1:請見 #2740 篇以及相關的回應 10/20 00:09