c++代码,大家帮忙解释一下operator+

#include<iostream>usingnamespacestd;//声明classPoint;Pointoperator+(Point&a,Point&b);//... #include <iostream>
using namespace std;

//声明
class Point;
Point operator+(Point &a,Point &b);

//定义点类
class Point
{
public:
int x,y;
Point(){}
Point(int xx,int yy){x=xx;y=yy;}
void print(){ cout<<"("<<x<<","<<y<<")\n"; }
friend Point operator+(Point &a,Point &b);
};

//重载+号操作(返回值)
Point operator+( Point &a,Point &b)
{
Point s(a.x+b.x,a.y+b.y);
return s;
}

//主函数
void main()
{
Point a(3,2),b(1,5),c;
c=a+b;
c.print();
}
为什么将上面代码改为以下代码就会出现错误呢??
#include <iostream>
using namespace std;

class Point
{
public:
int x,y;
Point(){}
Point(int xx,int yy){x=xx;y=yy;}
void print(){ cout<<"("<<x<<","<<y<<")\n"; }
Point operator+(Point &a,Point &b)
{
Point s(a.x+b.x,a.y+b.y);
return s;
}
};

//主函数
void main()
{
Point a(3,2),b(1,5),c;
c=a+b;
c.print();
}
展开
 我来答
时尚dog仔
2010-07-31 · TA获得超过7.5万个赞
知道大有可为答主
回答量:2.3万
采纳率:100%
帮助的人:5.7亿
展开全部
你的编程习惯有些繁琐和奇怪,共有两点
其一:公有变量最好定义为私有变量,否则就违背了类封装性的初衷了,虽然现在程序没有大的错误,但一旦程序大型化后,那个时候就比较麻烦了
其二:重载运算符函数定义有些繁琐,如
Point operator+( Point &a,Point &b)
{
Point s(a.x+b.x,a.y+b.y);
return s;
}
为何不写成返回一个有参数的构造函数
Point operator+( Point &a,Point &b)
{
return Point(a.x+b.x,a.y+b.y);
}
假如以上的你都接受和吸收的话,那开始看下面我对你题目的详解
运算符重载函数可以是类的成员函数,也可以是类的友元函数,还可以是既非类的成员函数也不是友元函数的普通函数。当然了,最后一个并不常用,原因是无法直接访问类的私有成员。(要访问也可以,只不过会降低程序的效率)
先来说说成员函数重载运算符,当你用其重载时,主函数中c++编译系统将表达式c=a+b解释为a.operator+(b)
所以,将你的程序改成
Point operator+(Point &b)
{
return Point(x+b.x,y+b.y);
}
就可以了
但是这就限制运算符左侧的值必须是一个类对象,不灵活不方便,因此就诞生了友元函数重载运算符
那现在来说说友元函数,当你用其重载时,主函数中c++编译系统将表达式c=a+b解释为operator+(a,b)
Point operator+( Point &a,Point &b)
{
return Point (a.x+b.x,a.y+b.y);
}
当然了,你这样定义只能重载两个类的加,若你想让一个类与整型相加,你可以如下重载
Point operator+( Point &a,int &b)
{
return Point (a.x+b,a.y);
}
注意:加法的交换律在c++中并不适用,也就是说整型与一个类加上述函数是无法完成的。
假如你还不懂的话,额,那你就死记吧,成员函数重载前一个类参数省略,而友元函数重载所有参与运算的参数必须全写出来,而且位置和参数类型要一一对应。
Ps:友元函数的使用会破坏类的封装性,因此原则上说,要尽量将运算符作为成员函数。但考虑到给方面的因素,一般将单目运算符重载为成员函数,将双目运算符重载为友元函数
柯中左莺语
2019-02-20 · TA获得超过3567个赞
知道大有可为答主
回答量:3002
采纳率:25%
帮助的人:447万
展开全部
他们都是对+运算符的重载,第一个是普通的重载,第二个是用了一个地址操作符,可以通过改变在内存中地址改变参数
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zzuqqiu
2010-07-31 · TA获得超过4297个赞
知道小有建树答主
回答量:721
采纳率:100%
帮助的人:868万
展开全部
在这里operator+定义为非成员函数。
因为系统没有为我们重载你自己写的类Point的加法,所以你只能自己写了。它是两个点的x和y分别相加,于返回一个Point。
让我们来具体看看这个函数。第一,它的返回值是一个对象,它一定不能为引用,因为两个点相加新生成的对象是一个局部变量,返回引用后这个+的重载函数中的局部变量消失了。但是若是成员函数的重载,则可以返回一个引用,因为这个引用可以*this。 第二,它的参数是两个引用,虽然不一定非要用引用,但是用引用能提高效率(直接用变量表示实参传递时要进行复制,效率自然没引用高了)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
21147813
2010-07-30 · TA获得超过364个赞
知道小有建树答主
回答量:400
采纳率:0%
帮助的人:0
展开全部
重载+符号,亦即是说,这个函数描述了两个point类如何相加。
平时我们的加号是 a+b,就是求a和b的和。但point类并不是数值型的,所以无法用+号,除非你重载了+号,告诉它如何处理两个point类相加的情况。

这里就是 当两个point类相加,就将point类的x坐标和y作弊好分别相加,再返回一个新的point
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式