新微赢技术网

标题: [求助](重载时的返回值s返回给了谁) [打印本页]

作者: √碧水寒潭    时间: 2009-11-3 03:56
标题: [求助](重载时的返回值s返回给了谁)
#include<iostream.h>
class a
{
int x,y;
public:
a(int i,int j)
{
x=i;y=j;
}
a(){}
void disp()
{
cout<<x<<','<<y<<endl;
}
a operator +(a m)
{
a s;
s.x=x+m.x;
s.y=y+m.y;
return s;
}
};
void main()
{
a a1(3,4),a2(5,6),a3;
a1.disp();
a3=a1+a2;
a3.disp();
小弟想问一下上面的成员函数中返回值给了a1还是a3呀,另外为什么写成这样不行呀,达不到加的效果(主函数)
void main()
{
a a1(3,4),a2(5,6),a3;
a1.disp();
a1+a2;
a1.disp();

作者: 攸哉vs攸哉    时间: 2009-11-3 03:56
a operator +(a m)
      {
          a s;
          s.x=x+m.x;
          s.y=y+m.y;
          return s;
      }

请仔细看自己的代码

你执行加运算的时候,是定义了一个局部的对象,进行+操作之后,是返回给 局部对象s,然后再return,这个期间, a1 并没有发生改变
想 a1发生改变
必须
x += x+ m.x;
y += y + m.y;
return *this;

因为 a1 + a2 在编译器来看,是 a1.operator +(a2, &amp;a1) //注意 &amp;a1相当于this指针
作者: 海的无奈    时间: 2009-11-3 03:56
a operator +(a m)
{
a s;
s.x=x+m.x;
s.y=y+m.y;
return s;
}
先给了临时,然后a3=s
不用friend不如利用this
a operator +(a m)
{
x=x+m.x;
y=y+m.y;
return *this;
}
不过最好用friend,因为你可以+左右都可以是常数
作者: 没心没肺    时间: 2009-11-3 03:56
谢谢两位,不过小弟想问一下,函数返回值是一个对象嘛,不是要有一个对象去接受吗,请问此例中,语句a1+a2后的
接受者是谁呀,语句a3=a1+a2后的又是那个呀,为什么语句a1+a2的前面不用一个接受的对象呢,像a3=a1+a2,但是也行
的通啊,谢谢啦!!!!
作者: 爱情海555    时间: 2009-11-3 03:56
你重载之后这个表达式得一个值(a1+a2)
然后有一个临时变量接受
然后给a3
你可以看成直接给a3了
a1+a2这里返回的值你谁也没给
作者: 青松    时间: 2009-11-3 03:56
首先谢谢啦,不过呢,如果这样的话,那
a operator +(a m)
{
x=x+m.x;
y=y+m.y;
return *this;
}
在主函数中有这么一个语句a1+a2;
运行是成功的,为什么明明要有一个返回的接受者,而只用a1去调用+,而没有返回值的接受者而不出错呢?
不吝赐教!!!!!vc下运行
作者: 航母风云    时间: 2009-11-3 03:56
因为你执行a operator +(a m)
      {
          x=x+m.x;
          y=y+m.y;
          return *this;
      }
的时候,a1的数值已经改变了,所以就算你不赋值给其他变量都不会出现错误,你要注意  这里的x = x+m.x ; x相当于this-&gt;x;
而this可以看成 this = &amp;a1;
作者: 导演    时间: 2009-11-3 03:56
谢谢啦




欢迎光临 新微赢技术网 (http://bbs.weiying.cn/) Powered by Discuz! X3.2