重载赋值运算符的返回值

cradmin 2007-08-16 06:11:05
最近看到C++的运算符重载,赋值运算符如=,+=,-=,.....,为什么operator=(),operator+=()...的返回值必须是对象的引用,书上说是保证这样的表达式赋值a=b=c,我把返回值改为按值返回,代码也能通过啊,到网上查了下,不过还是有点迷糊,大家给详细解释一下,有具体例子更好了,感谢。。。。。

对了,还有个问题麻烦下大家,函数调用按值返回(对象)时是不是都要生成一临时对象,但有时候根本用不到返回值,C++这样做是不是仅仅为了保证一致性
...全文
595 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
kvsupermark 2008-10-10
  • 打赏
  • 举报
回复
我想请教一下
为什么返回对象的引用进行a=b=c;操作的时候效率很高,是不是这样的赋值不需要调用拷贝构造函数,如果不是那他们又是怎样进行赋值的,望不吝赐教
jxlczjp77 2007-08-17
  • 打赏
  • 举报
回复
===================================================
1.用引用时,为什么临时变量不会析构,用指针就会,不太明白,这算不算指针跟引用的一个区别呢,能解释下吗,谢谢
===================================================

C++ primer上有提到这个问题,试验了一下也正确,算是规定吧,记住就行

const A &b=fun();//在vc6下确实加不加const都行,非const在新的标准中应该是不行
linux_is_perfect 2007-08-17
  • 打赏
  • 举报
回复
C++编程思想第二卷上有几乎所有操作符的重载

可以买一本看看, 书相当不错...
cradmin 2007-08-16
  • 打赏
  • 举报
回复
多谢楼上两位解答,
--------------------------------------------
再来一个指针的
A *c=&fun();
fun返回值填入临时变量后,将临时变量的指针赋给变量c,但这时候与引用不同,临时变量仍然会被析构,临时变量的生命期结束,b指向了一个已经被析构的对象,危险。
-------------------------------------------------
1.用引用时,为什么临时变量不会析构,用指针就会,不太明白,这算不算指针跟引用的一个区别呢,能解释下吗,谢谢


2.像fun();这样的调用,根本用不到返回的临时变量,这时也要生成临时变量,是吧

3.
----------------------------
不好像对于新的C++标准,需要一个const类型的引用才能指向临时对象,这样
const A &b=fun();
-------------------------
恩,应该是这样,
临时变量都是常量,那A &b=fun();这样的赋值,就是把常量赋给非常量引用,这在C++中不允许,我在VC++6.0试了下,也可以,是不是VC对标准支持不太好

jxlczjp77 2007-08-16
  • 打赏
  • 举报
回复
如果按值返回,你这样写a=b=c;是可以,但问题如楼上说的,效率太低了。

按值返回有按值返回的好处
A fun(){
A a;
//...
return a; //一定要按值返回,不能返回局部对象的引用
}

按值返回的临时变量,也并不一定马上就会被析构

这样
A a;
a = fun();//fun返回一个临时对象,赋值给a后临时对象将会析构

而这样:
A &b=fun();
fun返回值填入临时变量后,将临时变量的引用赋给变量b,由于有一个引用指向了这个临时变量,将不会再析构这个临时变量,相当于延长了这个临时变量的生命周期。

再来一个指针的
A *c=&fun();
fun返回值填入临时变量后,将临时变量的指针赋给变量c,但这时候与引用不同,临时变量仍然会被析构,临时变量的生命期结束,b指向了一个已经被析构的对象,危险。

不好像对于新的C++标准,需要一个const类型的引用才能指向临时对象,这样
const A &b=fun();
gfxiang 2007-08-16
  • 打赏
  • 举报
回复
当然你不返回引用也可以,不过效率低下,每次都得调用拷贝构造函数

64,682

社区成员

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

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