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

求解:关于函数返回引用的问题

liqiang
2010/11/10镜像同步8 回复
#include <iostream> using namespace std; float& fn2(float r) { float temp; temp = (float)(r*r*3.14); return temp; } int main() { float c=fn2(5.0); cout<<c<<endl; cout<<c<<endl; float& d=fn2(5.0); cout<<d<<endl; cout<<d<<endl; system("pause"); } 1,请问为什么第二个输出的d的值是0; 2,请问返回函数引用一般用于什么情况;以及函数返回引用的意义及原理; 请大家帮忙解答 Thanks。。
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
guo机器人#1 · 2010/11/10
http://forum.byr.edu.cn/wForum/disparticle.php?boardName=CPP&ID=45716&pos=13
liqiang机器人#2 · 2010/11/10
【 在 guo 的大作中提到: 】 : http://forum.byr.edu.cn/wForum/disparticle.php?boardName=CPP&ID=45716&pos=13 帖子我看了,可是我不知道这个函数用到的是局部变量,为什么第一个d还能出现结果,那个局部变量不是应该随着函数的结束就消失了么,那第二个输出d为什么又变成零了。
a206206机器人#3 · 2010/11/10
局部变量不返回引用是因为出了子函数变量占用的栈内存就不是你的了,可能会被后来的东西覆盖,至于什么时候被覆盖就是未定义的
renne机器人#4 · 2010/11/10
他这里cout了4次……我这里运行两次cout d的结果不同…… 有一次是正确的…… 【 在 a206206 (每天都被人超级鄙视的寂寞帝和悲剧帝) 的大作中提到: 】 : 局部变量不返回引用是因为出了子函数变量占用的栈内存就不是你的了,可能会被后来的东西覆盖,至于什么时候被覆盖就是未定义的
ilovelife机器人#5 · 2010/11/10
是这个样子的: 下面的函数 fn2表示,返回值是temp的引用,也就是说编译器解释成,函数fn2返回时直接从temp处进行内存拷贝 float& fn2(float r) { float temp; temp = (float)(r*r*3.14); return temp; } 那么就有 float c=fn2(5.0); //表示函数返回的时候,c从局部变量temp直接进行内存拷贝 而 float& d=fn2(5.0); //表示d就是局部变量temp 但是fn2已经返回,局部变量temp已经被销毁,可是d还引用着temp以前所占的内存 所以d的输出应该是乱码,也就是可以随便是什么值! 【 在 liqiang 的大作中提到: 】 : #include <iostream> : using namespace std; : float& fn2(float r) : ...................
renne机器人#6 · 2010/11/10
解释是这么解释 但是你运行过吗…… 用float接受的话应该是进行了值传递吧,所以肯定没错 【 在 ilovelife (王牌程序员) 的大作中提到: 】 : 是这个样子的: : 下面的函数 fn2表示,返回值是temp的引用,也就是说编译器解释成,函数fn2返回时直接从temp处进行内存拷贝 : float& fn2(float r) : ...................
buptjyl机器人#7 · 2010/11/11
为什么要返回局部变量?这种问题本身就是编程的禁区,何必还用研究,别这么做就是了
ilovelife机器人#8 · 2010/11/11
我没有运行绝对不会下结论 我对这个问题深入归纳总结了,还编了N个程序去验证 【 在 renne 的大作中提到: 】 : 解释是这么解释 : 但是你运行过吗…… : 用float接受的话应该是进行了值传递吧,所以肯定没错