c++符号重载中反回值为引用的问题

lyyscf 2008-10-27 02:08:27
#include<iostream>
using namespace std;
class A
{
private:
int n;
public:
A(int x=0){n=x;}
A &operator + (A &rhs);
A &operator = (A &rhs);
void SetN(int a){n=a;}
int GetN(void){return n;}
};
A &A::operator + (A&rhs)//去掉前面的&,或去掉后面函数参数表里面的&可得出正确结果,但不知道原因
{
A b,*p;
b.SetN(n+rhs.n);
return b;/**/


}
A &A::operator = (A &rhs)//
{
n=rhs.n;//调试时发现此处rhs.n的值不是a+b的值
return rhs;
}
int main()
{
A a(234),b(432),c;
c=a+b;
cout<<c.GetN()<<endl;
}/**/
...全文
96 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
aptx4869cool 2012-09-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

你先要去理解下“引用”的概念,以及会要注意的事情。

A &A::operator + (A&rhs)//去掉前面的&,或去掉后面函数参数表里面的&可得出正确结果,但不知道原因
{
A b,*p;
b.SetN(n+rhs.n);
return b;/**/

}
前面的人说的对,b是局部变量,分配在栈上,等出来这个函数,是要被回收的……
[/Quote]
+ 号本来就不应该返回引用,若是A &A::operator + (A&rhs )
{
this->n += rhs.n;
return *this;
}那就改变了左操作数,写了a+b结果a的值变了,你不觉得奇怪嘛,+号还是习惯重载为友元
做鸡真好吃 2009-01-15
  • 打赏
  • 举报
回复
mark~
xuedaoli 2008-10-28
  • 打赏
  • 举报
回复
你先要去理解下“引用”的概念,以及会要注意的事情。

A &A::operator + (A&rhs)//去掉前面的&,或去掉后面函数参数表里面的&可得出正确结果,但不知道原因
{
A b,*p;
b.SetN(n+rhs.n);
return b;/**/

}
前面的人说的对,b是局部变量,分配在栈上,等出来这个函数,是要被回收的,所以返回的引用找不到对应的对象。
建议不要采用局部变量的形式实现,
1.不安全,返回空的
2.效率不高,要执行多余的构造和析构的操作。
采用下面的方法


A &A::operator + (A&rhs )
{
this->n += rhs.n;
return *this;
}
春江花月园 2008-10-27
  • 打赏
  • 举报
回复
局部变量b在返回是已经回收了,它的地址(或引用)已经无效了,返回对象可以.或者在堆上创建对象
kingofice 2008-10-27
  • 打赏
  • 举报
回复
A &A::operator + (A&rhs)//去掉前面的&,或去掉后面函数参数表里面的&可得出正确结果,但不知道原因
{
A b,*p;
b.SetN(n+rhs.n);
return b;/**/
}
b是一个局部变量,出函数则变量出栈,无效了,返回其引用是无效的,应该返回一个零时对象才对(去掉第一行前面的&)

64,282

社区成员

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

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