VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3332|回复: 23

引用与连续赋值问题,多谢!

[复制链接]

1

主题

8

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
发表于 2020-1-4 23:00:01 | 显示全部楼层 |阅读模式
经常看到这么一个例子,
对于一个类及三个对象a, b, c, 如果operator =返回的是一个引用的话,a=b=c可以成功,但如果不是返回引用,则会出错,谁可以告诉我为什么会这样,谢谢。
回复

使用道具 举报

1

主题

8

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-5 00:54:01 | 显示全部楼层
具体代码可参考http://bjtuwei.bokee.com/4223564.html
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-1-5 01:12:01 | 显示全部楼层
a=b=c;
传引用的话:
第一效率高可避免拷贝开销
第二先执行b=c,它的返回值作a=的参数,所以operator=的返回值类型和参数类型是相同的,传引用
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-1-5 01:51:01 | 显示全部楼层
传对象可以但是增加了拷贝的开销,
传回void不可以,打断连续赋值的语法形式
a=b=c;处理顺序为a=(b=c);因为b=c的返回值是个void,这时a=的operator=的形参需const Type&,而实参,是一个void,会报错
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-1-5 02:06:01 | 显示全部楼层
个人意见,高手多多指教
回复

使用道具 举报

1

主题

8

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-5 03:51:01 | 显示全部楼层
我理解的意思是,如果不是返回引用的话,也应该先计算b.operator=(c),此时会返回一个中间变量,然后此变量再作为a=的参数,一样可以成功啊,为什么不行,而且b=好像也没成功。
回复

使用道具 举报

1

主题

8

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-5 05:54:01 | 显示全部楼层
在我给出的链接中有执行结果,我不明白的地方是为什么a,b的值均为99,也就是说b=没有成功,而b的值却给了a。谢谢。
回复

使用道具 举报

2

主题

54

帖子

34.00

积分

新手上路

Rank: 1

积分
34.00
发表于 2020-1-5 06:09:01 | 显示全部楼层
返回对象可以不能有好的效率
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-1-5 07:03:01 | 显示全部楼层
(A=B)= C如果返回的是值而不是引用,那A=B得到的是一个右值,一个右值当左值来使当然出错了。

简单地说 a=1 ,b=2,c=3  现在(a=b)=c就相当于 2=c,把C赋给2这个值,不荒唐吗?但如果返回的是引用就成了(a)=c。
回复

使用道具 举报

1

主题

8

帖子

4.00

积分

新手上路

Rank: 1

积分
4.00
 楼主| 发表于 2020-1-5 07:45:01 | 显示全部楼层
To julines:
a=b=c如果加括号的话,不是应该a=(b=c)吗?
在返回引用的情况下,如果按照(a=b)=c的话,第一步是a=b, 然后a=c,那么对b的赋值那?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表