猿问

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

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)也会出现这种问题。。。。   小白表示跪死了。。求大触解释。。。

慕粉3379761
浏览 1441回答 2
2回答

onemoo

很好,你明白 (t2+t3) 的结果是个临时变量,也就是个右值(rvalue)。可是只有const引用类型可以引用临时变量,而你的重载加法函数要求的参数却是个非const类型。所以无法调用。就算你换成 Time(1,2,3)也一样,这也是临时构造了一个Time对象,同样无法匹配参数类型。改成这样就好了 Time operator+(const Time &t)

onemoo

回复中写不开,再答一贴:简单地说,一句话:C++语法规定如此。而仔细想想,按道理也应该如此:如果允许普通引用类型可以引用临时变量,那么你是可以通过这个引用来“读”/“写”这个临时变量的。既然能向这个引用写入值,那么程序员可能会期待在后面的程序中能继续使用这个引用,然而这个引用实际上只是个临时变量,随时会被销毁。 并且允许更改临时变量的值也没什么意义(如: 代码中的(t2+t3) ,这里只是想“读取”它的值,允许你写入它或修改它的值有什么意义呢?)。所以语言干脆规定只有const引用才能引用临时变量。
随时随地看视频慕课网APP
我要回答