请高手指点下加法运算符重载问题,谢谢!

xq0922 2009-03-29 09:33:41
#include<iostream.h>
class point
{
int x,y;
public:
point(){x=y=0;}
point(int i,int j){x=i;y=j;}
point(point &p){x=p.x;y=p.y;} //此语句可省略,想想为什么
~point(){}
void offset(int i,int j){x+=i; y+=j;}
void offset(point);
bool operator==(point);
void operator+=(point);
point operator+(point);
int getx(){return x;}
int gety(){return y;}
point& operator++(); //声明前缀单目运算符重载函数
point operator++(int); //声明后缀单目运算符重载函数
void print(){cout<<"The point is ("<<x<<","<<y<<")\n";}
};
void point::offset(point p)
{
x+=p.getx(); y+=p.gety();
}
bool point::operator ==(point p)
{
if (x==p.getx()&&y==p.gety())
return true;
else
return false;
}
void point::operator+=(point p)
{
x+=p.getx();y+=p.gety();
}
point point::operator +(point p)
{
this->x+=p.x; this->y+=p.y;
return *this;
}
point& point::operator++()
{
x++; y++;
return *this;
}
point point::operator++(int)
{
point temp=*this;
++ this->x; ++ this->y; //++ *this;
return temp;
}
void main()
{
point obj,obj1(3,4),obj2(5,6),obj3(obj2),obj4;
obj.print(); obj1.print(); obj2.print(); obj3.print();
obj++; obj.print();
++obj; obj.print();
cout<<"\n";
obj1.offset(10,10);obj1.print();
obj1.offset(obj2);obj1.print();
if(obj2==obj1)
cout<<"The obj2 is equal to obj1 !"<<endl;
else
cout<<"The obj2 isn't equal to obj1 !"<<endl;
obj1+=obj2;obj1.print();
obj+obj1;obj.print();obj1.print();
cout<<endl;
obj4=obj+obj1+obj2+obj3; obj4.print();obj.print();
}


这段程序的运行结果是
The point is (0,0)
The point is (3,4)
The point is (5,6)
The point is (5,6)
The point is (1,1)
The point is (2,2)

The point is (13,14)
The point is (18,20)
The obj2 isn't equal to obj1 !
The point is (23,26)
The point is (25,28)
The point is (23,26)

The point is (58,66)
The point is (48,54)
Press any key to continue

想问一下问什么
obj的值与obj4的值不相等呢,在加法运算符重载中this指针不是应该就是obj吗,obj与obj1相加返回obj然后在和obj2相加一次类推最后应该obj与obj4相等呀?但是事实上不是,每次连加时总是将第一次最前两个对象相加返回给第一个对象以后相加就不行了,为什么,哪位高手给指点指点,小弟不胜感激!
...全文
103 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
bushizhuge 2009-03-30
  • 打赏
  • 举报
回复
point point::operator +(point p) 
{
this->x+=p.x; this->y+=p.y;
return *this;
}

你这个运算符重载返回的是一个point对象,所以在return *this;的时候,系统会给你生成一个临时对象,保存this对象的值,然后返回,在obj4=obj+obj1+obj2+obj3;执行时,首先 obj+obj1,这时obj的值改变了,但是在随后的+运算中,改变的都是那个返回的临时对象的值,所以最后obj4和obj不一样。你若是非要达到一样的效果,应该返回一个引用,即将+的重载函数改为point& point::operator +(point p);
不过你这个+ 运算符搞得和 += 一样了,这样不好,应该这样实现
point point::operator +(point p) 
{
point pt;
pt.x = x + p.x;
pt.y = y + p.y;
return pt;
}
  • 打赏
  • 举报
回复
point point::operator +(point p)
{
this->x+=p.x; this->y+=p.y;
return *this;
}
+号不应该这么重载吧,+号应该动用第3个副本来接收this跟p 的结果,并返回之
biosli 2009-03-29
  • 打赏
  • 举报
回复
是不是你声明的函数并不是重载系统默认的那个。
建议你检查一下你的声明是否正确,或者在你的函数里面添加断点看看进去没有。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧