作者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