返回信息流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 ;
这是一条镜像帖。来源:北邮人论坛 / cpp / #6073同步于 2008/5/2
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
C++ primer 第四版 第439页这个+号重载是不是有问题啊?
maroon
2008/5/2镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Sale_itme应该是一个类吧,类的作用域和生命周期不同于普通的局部变量,如果我没记错的话,类的内存是在堆上分配的,它的生命周期应该和main函数一样,所以它的内存不会因为调用函数的结束而消失;
当然就可以返回了;
ps:好久没看c++的类了,如果说错了的话客气点blame
【 在 maroon (mumu) 的大作中提到: 】
: Sales_item operator+(const Sales_item& lhs,const Sales_item& rhs)
: {
: Sales_item ret(lhs) ;
: ...................
没有问题,它返回的是一个值,而不是引用,所以是正确的。在item1 = item2 + item3 中发生了一次值拷贝(赋值),也就是将item2+item3返回的局部变量拷贝给了item1之后,局部变量的作用域结束
可以返回局部变量,但是不能返回局部变量的引用。理解区分值和引用这两个概念是学习C++的一大关键,明白这两个概念之后,你就会理解为什么C++的类里面需要有拷贝构造函数,赋值操作符,析构函数三个元素了以及其它的一些稀里古怪的用法和忠告了
【 在 UnitTest 的大作中提到: 】
: 没有问题,它返回的是一个值,而不是引用,所以是正确的。在item1 = item2 + item3 中发生了一次值拷贝(赋值),也就是将item2+item3返回的局部变量拷贝给了item1之后,局部变量的作用域结束
: 可以返回局部变量,但是不能返回局部变量的引用。理解区分值和引用这两个概念是学习C++的一大关键,明白这两个概念之后,你就会理解为什么C++的类里面需要有拷贝构造函数,赋值操作符,析构函数三个元素了以及其它的一些稀里古怪的用法和忠告了
茅塞顿开,明白了,多谢
但我想说的是,返回的绝对不是局部变量,而是其副本
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这个 对象一直在主函数中贮存(虽然显示是看不到的 )
原来如此
【 在 maroon (mumu) 的大作中提到: 】
: Sales_item operator+(const Sales_item& lhs,const Sales_item& rhs)
: {
: Sales_item ret(lhs) ;
: ...................