C++里的重载运算符“+”的返回值为什么不能是引用&????而一元的最好用引用????

lijdking 2003-06-15 03:11:30
比如:
#include<iostream.h>
class point
{
private:
int x,y;
public:
point() { }
point(int i,int j) { x=i;y=j;}
void disp()
{
cout<<"("<<x<<","<<y<<")"<<endl;
}
point opetator+(pont &P) //不是point &opetator+(pont &P)
{
return pont(x+p.x,y+p.y);
}
};
void main()
{
pont p1(3,4),p2(2,9),p3;
p3=p1+p2;
p3.disp();
}

好象说一元重载运算符的返回值用引用&,二元的则不是??
书上说得有些看不大懂,还望大侠指导!
...全文
362 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ming0753 2010-06-07
  • 打赏
  • 举报
回复
我对这也超模糊
晨星 2003-06-16
  • 打赏
  • 举报
回复
好!好!up!
楼主别忘了整理FAQ哦,可以增加可用分的!^o^
Meyer 2003-06-16
  • 打赏
  • 举报
回复
其实这几个问题在
<Effective C++>都有讲叙,很清楚的
Meyer 2003-06-16
  • 打赏
  • 举报
回复
呵呵 我已经收藏,只要他结帖
她不整理我会来收这一分信誉分的:)
WhatCanIdoing 2003-06-15
  • 打赏
  • 举报
回复
假设f是想正确声明的函数,c是和它相关的类:

·虚函数必须是成员函数。如果f必须是虚函数,就让它成为c的成员函数。

·operator>>和operator<<决不能是成员函数。如果f是operator>>或operator<<,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。

·只有非成员函数对最左边的参数进行类型转换。如果f需要对最左边的参数进行类型转换,让f成为非成员函数。如果f还需要访问c的非公有成员,让f成为c的友元函数。

·其它情况下都声明为成员函数。如果以上情况都不是,让f成为c的成员函数。
magic007 2003-06-15
  • 打赏
  • 举报
回复
在楼主所举的第二个例子中,Number明显是右操作数(二元运算符右边的操作数),而实际上类函数(包括运算符重载函数),编译器会自行增加this作为第一个参数,如楼主所示的函数变成了三个参数了,当然不行。并且由于this作为第一参数的原因,定义于类内的运算符重载函数,只能作为左操作数。为了能让我们定义的对象作为右操作数,只能在类外面定义。
为什么要让类外面定义的运算符重载函获得成为类的友元,是因为在类外面的函数,包括运算符重载函数,要访问类内的private和protected成员,必须成为类的友元。这是大家都知道的,不用多说。不过不成为类的友元也可以,有两种情况:1,不会访问类的私有成员2,通过类提供的公共接口访问私有成员
如在Number内定义 int GetX(){ return x;}
在ostream& (ostream& dest,const Number& oo) 中改为{dest<<oo.GetX();return dest;}
至于为什么用inline,是基于效率考虑,针对此例,重载函数内代码少,用inline可提高效率。
晨星 2003-06-15
  • 打赏
  • 举报
回复
改成友元可以,但为什么运算符重载<<不是友元不行呢?
这一点兄弟也是一知半解,只是下意识觉得跟别的类合作,不是友元应该不行,希望高手能给出确切说法。

运算符重载当然不必是内联函数,但这里好像还有别的问题,哪位大哥解释一下吧,:P
lijdking 2003-06-15
  • 打赏
  • 举报
回复
To steedhorse(晨星):
改成友元可以,但为什么运算符重载<<不是友元不行呢?
还有:
运算符重载函数一定是内联函数吗?
晨星 2003-06-15
  • 打赏
  • 举报
回复
ostream & operator<<(ostream &dest,Number& oo){cout<<oo.x<<endl;}
改为:
friend ostream & operator<<(ostream &dest,Number& oo){cout<<oo.x<<endl;return cout;}
lijdking 2003-06-15
  • 打赏
  • 举报
回复
谢谢大侠们
#include<iostream.h>
class Number
{
int x;
public:
Number() {x=0;}
Number(int i) {x=i;}
void disp() {cout<<"x="<<x<<endl;}
void operator++() {cout<<"前置";x++;} //前置运算符
void operator++(int) {cout<<"后置"; x+=2;}//后置运算符

ostream & operator<<(ostream &dest,Number& oo){cout<<oo.x<<endl;}//这哪
//里错了?把它放在类外定义也不行?
};
void main()
{
Number obj(5);
obj.disp();
cout<<obj<<endl;

obj.disp();
obj++;
obj.disp();
}

ompiling...
8.cpp
E:\C++\c++学习\6月份\6_15\1\8.cpp(24) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class Number' (or there is no acceptable conversion)
Error executing cl.exe.

8.obj - 1 error(s), 0 warning(s)
是什么意思???
sttony 2003-06-15
  • 打赏
  • 举报
回复
《effctive c++》上讲的很明白。
如果"+"返回引用,返回谁的引用呢?如steedhorse(晨星) 所说,返回一个函数内部的局部变量显然是不行的。你也可以返回*this,但这样的"+"和内建的"+"语义不一样了。
hiys 2003-06-15
  • 打赏
  • 举报
回复
引用就是要更改第二个操作数的值,既然你不需要,那何必用呢?
晨星 2003-06-15
  • 打赏
  • 举报
回复
因为二元“+”返回的式函数内部的局部变量,如你的程序中临时生成一个point对象:
pont(x+p.x,y+p.y);
并返回,引用它会造成麻烦。
而一元“+”通常返回运算数本身,在同一作用域中引用它不会出问题,而且返回引用的用途比返回对象大,当然,也可以不返回引用,但返回引用用处多(可使用其左值),某些情况下不需要拷贝(如Point&p = +p1),效率也高,和乐而不为呢?

70,009

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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