关于引用函数返回值的问题

QQIANQQ 2010-12-09 10:02:31

请问一下大家a为什么是(3,4)而不是(5,6)。。再最后一步return *this执行完后(但是没跳出函数)。(调试时发现)a和this都是(5,6),为什么跳出函数就变成(3,4)。求详细解答!谢谢~


#include <iostream>
using namespace std;
class A
{
public:
int x ;
int y ;
public:
A(int a,int b)
{
x = a ;
y = b ;
}
A operator = (const A &a) ;
};

A A::operator = (const A &a)
{
if (this !=&a )
x = a.x ;
y = a.y ;
return *this ;
}

int main()
{
A b(3,4),c(5,6);
static A a(1,2);
(a=b)=c;
cout<<a.x<<endl;
cout<<a.y<<endl;
system("pause");
return 0;
}
请问一下大家a为什么是(3,4)而不是(5,6)。。再最后一步return *this执行完后。(调试时发现)a和this都是(5,6),为什么跳出函数值就变成(3,4)。求详细解答!谢谢~
...全文
106 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2010-12-10
  • 打赏
  • 举报
回复
(a=b)=c中,a=b是把b赋值给a,返回a自身,整个式子是这样的:

a=b;
a=c;
QQIANQQ 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qq120848369 的回复:]
C/C++ code
(a=b)=c中,a=b是把b赋值给a,返回a自身,整个式子是这样的:

a=b;
a=c;
[/Quote]
当然是没有引用的情况下~
QQIANQQ 2010-12-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qq120848369 的回复:]
C/C++ code
(a=b)=c中,a=b是把b赋值给a,返回a自身,整个式子是这样的:

a=b;
a=c;
[/Quote]
好像不是这样的~你可以自己查看一下结果~呵呵
测试昵称666 2010-12-10
  • 打赏
  • 举报
回复
A& A::operator = (const A &a)  
{
if (this !=&a )
{
x = a.x ;
y = a.y ;
}
return *this ;
}


这样就OK了。
就想叫yoko 2010-12-09
  • 打赏
  • 举报
回复
(a=b)=c中(a=b)是一个临时变量?还是里边的this?
没错,只不过它在接收c的值之前它的值和*this一样

类的成员函数里面的this不是临时对象,是指向它自身的指针
QQIANQQ 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 q191201771 的回复:]
因为重载=的那个函数返回的是*this,是对象与对象的传值,接收的是个临时对象
所以你c其实是赋值给了一个临时对象
[/Quote]
那请问一下。(a=b)=c中(a=b)是一个临时变量?还是里边的this?

A A::operator = (const A &a)
{
if (this !=&a )//这里的this是临时对象的this?
//如果改成A& A::operator = (const A &a)
//那么这个this直接指向调用这个函数的对象的指针?
x = a.x ;
y = a.y ;
return *this ;
}
nwpucoder 2010-12-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 foxpeter 的回复:]

A& operator = (const A &a) ;


A& A::operator = (const A &a)
{
if (this !=&a )
{
x = a.x ;
y = a.y ;
}
return *this ;
}

这样应该就OK了 if后面还差个{}
……
[/Quote]
正解, 要返回引用
無_1024 2010-12-09
  • 打赏
  • 举报
回复
把那个引用去掉就可以了 我以前也出现过
QQIANQQ 2010-12-09
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A
{
public:
A(int a,int b)
{
x = a ;
y = b ;
}

A& operator = (const A &a) ;//

public:
int x ;
int y ;
};

A A::operator = (const A &a) //修改成非引用
{
if ( this !=&a )
{
x = a.x ;
y = a.y ;
}

return *this ;// (a=b)=c;
// 这一步执行完以后a已经变成(5,6)调试的时候发现的。还有this也变成(5,6)。跳出}后a值就变成(3,4)。这个是我纠结的地方!
}

int main()
{
A b(3,4),c(5,6);
static A a(1,2);

(a=b)=c;

cout<<a.x<<endl;
cout<<a.y<<endl;

return 0;
}

qq120848369 2010-12-09
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A
{
public:
A(int a,int b)
{
x = a ;
y = b ;
}

A& operator = (const A &a) ;//

public:
int x ;
int y ;
};

A& A::operator = (const A &a)
{
if ( this !=&a )
{
x = a.x ;
y = a.y ;
}

return *this ;
}

int main()
{
A b(3,4),c(5,6);
static A a(1,2);

(a=b)=c;

cout<<a.x<<endl;
cout<<a.y<<endl;

return 0;
}
foxpeter 2010-12-09
  • 打赏
  • 举报
回复
A& operator = (const A &a) ;


A& A::operator = (const A &a)
{
if (this !=&a )
{
x = a.x ;
y = a.y ;
}
return *this ;
}

这样应该就OK了 if后面还差个{}
就想叫yoko 2010-12-09
  • 打赏
  • 举报
回复
因为重载=的那个函数返回的是*this,是对象与对象的传值,接收的是个临时对象
所以你c其实是赋值给了一个临时对象

64,683

社区成员

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

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