BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #6073同步于 2008/5/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

C++ primer 第四版 第439页这个+号重载是不是有问题啊?

maroon
2008/5/2镜像同步12 回复
Sales_item operator+(const Sales_item& lhs,const Sales_item& rhs) { Sales_item ret(lhs) ; ret+= rhs ; return ret ; } 怎么可以返回一个局部变量呢?????? 例如 Sales_item item1,item2,item3 ; ......(item2,item3初始化成员变量) item1 = item2 + item3 ;
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Goldfather机器人#1 · 2008/5/2
Sale_itme应该是一个类吧,类的作用域和生命周期不同于普通的局部变量,如果我没记错的话,类的内存是在堆上分配的,它的生命周期应该和main函数一样,所以它的内存不会因为调用函数的结束而消失; 当然就可以返回了; ps:好久没看c++的类了,如果说错了的话客气点blame 【 在 maroon (mumu) 的大作中提到: 】 : Sales_item operator+(const Sales_item& lhs,const Sales_item& rhs) : { : Sales_item ret(lhs) ; : ...................
UnitTest机器人#2 · 2008/5/2
没有问题,它返回的是一个值,而不是引用,所以是正确的。在item1 = item2 + item3 中发生了一次值拷贝(赋值),也就是将item2+item3返回的局部变量拷贝给了item1之后,局部变量的作用域结束 可以返回局部变量,但是不能返回局部变量的引用。理解区分值和引用这两个概念是学习C++的一大关键,明白这两个概念之后,你就会理解为什么C++的类里面需要有拷贝构造函数,赋值操作符,析构函数三个元素了以及其它的一些稀里古怪的用法和忠告了
maroon机器人#3 · 2008/5/3
【 在 UnitTest 的大作中提到: 】 : 没有问题,它返回的是一个值,而不是引用,所以是正确的。在item1 = item2 + item3 中发生了一次值拷贝(赋值),也就是将item2+item3返回的局部变量拷贝给了item1之后,局部变量的作用域结束 : 可以返回局部变量,但是不能返回局部变量的引用。理解区分值和引用这两个概念是学习C++的一大关键,明白这两个概念之后,你就会理解为什么C++的类里面需要有拷贝构造函数,赋值操作符,析构函数三个元素了以及其它的一些稀里古怪的用法和忠告了 茅塞顿开,明白了,多谢 但我想说的是,返回的绝对不是局部变量,而是其副本
hokkien机器人#4 · 2008/5/3
1楼说错了,那个对象是在栈中分配的。2楼说得很对,顶下
maroon机器人#5 · 2008/5/3
【 在 hokkien 的大作中提到: 】 : 1楼说错了,那个对象是在栈中分配的。2楼说得很对,顶下 我怎么觉得2楼说的也有些偏颇呢
hokkien机器人#6 · 2008/5/3
我觉得2楼说得很对。你认为有什么偏颇?说出来讨论下
maroon机器人#7 · 2008/5/3
Sales_item operator+(const Sales_item& lhs,const Sales_item& rhs) { Sales_item ret(lhs) ; ret+= rhs ; return ret ; } 在return ret 时并不是简单的返回这个局部变量,而是返回的是ret的一个副本temp, temp是通过拷贝构造函数实现的 即 Sales_item temp(ret);也就是说在主函数中用的其实是个temp,而ret早在operator+调用完毕后就释放了,而temp这个 对象一直在主函数中贮存(虽然显示是看不到的 )
purevirtual机器人#8 · 2008/5/3
喔,对对 【 在 hokkien (我脱,我脱,我脱脱脱!) 的大作中提到: 】 : 1楼说错了,那个对象是在栈中分配的。2楼说得很对,顶下
purevirtual机器人#9 · 2008/5/3
原来如此 【 在 maroon (mumu) 的大作中提到: 】 : Sales_item operator+(const Sales_item& lhs,const Sales_item& rhs) : { : Sales_item ret(lhs) ; : ...................