FastestSnail 2016-11-28 03:21 采纳率: 0%
浏览 1207

关于C++中重载赋值操作符(=)返回引用的问题

C++小白一枚,遇到一个问题,查了很多资料还是没有想明白。
书上都说C++在重载赋值操作符(=)时,应该返回一个引用,这是因为能够实现链式赋值:比如a=b=c=1
但是,返回一个临时变量,会出现什么问题呢?
比如
class A{...};中有一个赋值操作符重载,返回A,原型如下:
A operator=(const A &);
定义了几个A类的变量 A a,b,c,d;
然后让a有了完整的成员。执行如下表达式:
b=c=d=a <=> b=(c=(d=a))
当d=a完成后,返回一个临时变量,然后c会调用赋值操作符重载的函数,把内部成员进行拷贝,执行结束后,c获得了d相同的内容,然后(d=a)中返回的d的临时变量
释放了,然后把c的临时变量给b,以此类推。

感觉这个过程也不会有什么问题呀。

为什么一定要返回引用呢?

我的想法:是不是因为返回临时变量,会需要一个临时变量的空间,如果是ADT或UDT,可能造成内存浪费或者效率低下?但是这个方法没有语法层面上的问题?

除此以外:如果有一个移动赋值函数,在链式赋值第二次开始,是不是会调用该移动赋值函数呢?这种情况下,对内存空间和效率有影响吗?

  • 写回答

2条回答 默认 最新

  • Xefvan 2016-11-29 04:50
    关注

    重载赋值操作符(=)返回引用的原因

    1. 允许进行连续赋值

    2. 防止返回对象(返回对象也可以进行连续赋值)的时候调用拷贝构造函数和析构函数导致不必要的开销,降低赋值运算符等的效率。

    对于第二点原因:如果用“值传递”的方式,虽然功能仍然正确,但由于return语句要把*this拷贝到保存返回值的外部存储单元之中,增加了不必

    要的开销,会降低赋值函数的效率

    评论

报告相同问题?

悬赏问题

  • ¥100 c语言,请帮蒟蒻看一个题
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)