为了账号安全,请及时绑定邮箱和手机立即绑定

求大触解释关于c++运算符重载

求大触解释关于c++运算符重载

C++
慕粉3379761 2016-07-25 18:54:23
Time operator+(Time &t) { return Time(m_iHour+t.m_iHour,m_iMinute+t.m_iMinute,m_iSecond+t.m_iSecond); }main中: Time t(6, 30, 20),t1(1,3,4),t2=t1,t3=t2;        ((t+t1)+(t2+t3)).display();显示报错:[Error] no match for 'operator+' (operand types are 'Time' and 'Time')小白表示不明白了,求解释 T-T  虽然t2+t3的结果是一个临时变量但也得在整条语句结束后才释放不是吗?那么在t+t2的结果与t2+t3的结果调用“+”时,虽然传的是临时变量,但在使用期间不是安全的吗?之前也用typeid检查过临时变量也是Time的对象。。。。 0.0 为啥报的错表示是对于运算符+没有匹配啊   。0.0 。。若将t2+t3的括号去掉则没用这种问题,将其换成Time(1,2,3)也会出现这种问题。。。。   小白表示跪死了。。求大触解释。。。
查看完整描述

2 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

很好,你明白 (t2+t3) 的结果是个临时变量,也就是个右值(rvalue)。

可是只有const引用类型可以引用临时变量,而你的重载加法函数要求的参数却是个非const类型。所以无法调用。

就算你换成 Time(1,2,3)也一样,这也是临时构造了一个Time对象,同样无法匹配参数类型。


改成这样就好了 Time operator+(const Time &t)

查看完整回答
1 反对 回复 2016-07-25
  • 慕粉3379761
    慕粉3379761
    请问,能解释一下为什么只有const引用类型可以引用临时变量呢?
?
onemoo

TA贡献883条经验 获得超454个赞

回复中写不开,再答一贴:

简单地说,一句话:C++语法规定如此。


而仔细想想,按道理也应该如此:

如果允许普通引用类型可以引用临时变量,那么你是可以通过这个引用来“读”/“写”这个临时变量的。

既然能向这个引用写入值,那么程序员可能会期待在后面的程序中能继续使用这个引用,然而这个引用实际上只是个临时变量,随时会被销毁。 并且允许更改临时变量的值也没什么意义(如: 代码中的(t2+t3) ,这里只是想“读取”它的值,允许你写入它或修改它的值有什么意义呢?)。

所以语言干脆规定只有const引用才能引用临时变量

查看完整回答
反对 回复 2016-07-26
  • 2 回答
  • 0 关注
  • 1440 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信