关于用函数返回一个引用,到底是怎么回事呢

vs9841 2015-10-31 06:50:38

#include <iostream>
#include <string.h>
//在一个函数中返回一个引用变量b,是可行的,但是如果直接返回a,则不可取,因为a是一个临时变量。
int & func2(){
int a = 20;
int &b = a;
printf("a = %d %p, &b = %d %p\n",a,&a,b,&b);
return b;
}
int main(){
int x = 0;
x = func2();
printf("x = %d %p\n",x,&x);
return 0;
}


我用上面的这段代码可以正常可以工作,但是如果我直接让func()函数返回 a,而不是引用b,就会报错。

int & func2(){
int a = 20;
int &b = a;
printf("a = %d %p, &b = %d %p\n",a,&a,b,&b);
return a;
}

附:我在gcc下面测试的。。。
...全文
179 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-11-02
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
paschen 版主 2015-11-01
  • 打赏
  • 举报
回复
引用 5 楼 lm20101 的回复:
应该是都不可以吧,因为局部变量在函数运行完毕就已经释放了,所以不论是哪一种返回都会指向未知地址,都是非法的。
VS下调试没问题,只是会给出一条警告,不管有没问题都不建议返回局部变量的引用或者指针
ID870177103 2015-11-01
  • 打赏
  • 举报
回复
引用 11 楼 vs9841 的回复:
[quote=引用 10 楼 ID870177103 的回复:] 为什么返回B可行 #include <iostream> using namespace std ; struct A { int a ; friend inline istream &operator>> (istream &is ,A &a) { return is >> a.a ; } } ; int main () { A a ,b ; cin >> a >> b ; return 0 ; }
b也是不可以返回的,虽然他没有报错,这个b指向的是一个局部的变量a,例如: int a = 5; int &b = a ; //这条语句,会被处理成int * const b = &a[/quote] 。。。。。。看代码
vs9841 2015-11-01
  • 打赏
  • 举报
回复
引用 10 楼 ID870177103 的回复:
为什么返回B可行 #include <iostream> using namespace std ; struct A { int a ; friend inline istream &operator>> (istream &is ,A &a) { return is >> a.a ; } } ; int main () { A a ,b ; cin >> a >> b ; return 0 ; }
b也是不可以返回的,虽然他没有报错,这个b指向的是一个局部的变量a,例如: int a = 5; int &b = a ; //这条语句,会被处理成int * const b = &a
ID870177103 2015-11-01
  • 打赏
  • 举报
回复
为什么返回B可行 #include <iostream> using namespace std ; struct A { int a ; friend inline istream &operator>> (istream &is ,A &a) { return is >> a.a ; } } ; int main () { A a ,b ; cin >> a >> b ; return 0 ; }
gznotes.net 2015-10-31
  • 打赏
  • 举报
回复
局部变量(函数内部定义)是使用栈上内存的,而栈内存是随着函数的调用和返回动态使用的。 所以,一般函数返回后,它里面的局部变量所对应的内存空很可能已经被用作别的用途了。即使暂时没有被别的信息覆盖,也是碰巧。 所以,返回值不要返回局部变量,不要返回指向局部变量的引用和指针。 引用的含义,我理解和指针差不多,不过比指针安全些吧。
lm_whales 2015-10-31
  • 打赏
  • 举报
回复
返回引用的函数,可以 1)返回引用参数,或者引用参数的一个的成员变量(的引用) 2)返回 *this 或者 *this 的成员变量(的引用) 3)返回局部静态对象以及成员变量(的引用),类静态变量以及成员变量(的引用) (其他)全局对象的引用 4)返回 以上对象的某种强制转换结果,转换结果是一种引用(引用的实际对象,在以上对象内部),
YUSHUIHE 2015-10-31
  • 打赏
  • 举报
回复
3楼说的对。
lm20101 2015-10-31
  • 打赏
  • 举报
回复
应该是都不可以吧,因为局部变量在函数运行完毕就已经释放了,所以不论是哪一种返回都会指向未知地址,都是非法的。
paschen 版主 2015-10-31
  • 打赏
  • 举报
回复
引用 3 楼 vs9841 的回复:
我能这么说吗: 使用引用做为函数返回时,这个返回对像,必须是在它外面定义过的,例如全局变量,而不能返回一个局部变量,即使用局部的变量绑定了一个引用也是错误的。
语法允许,但是是返回局部对象是未知操作
vs9841 2015-10-31
  • 打赏
  • 举报
回复
我能这么说吗: 使用引用做为函数返回时,这个返回对像,必须是在它外面定义过的,例如全局变量,而不能返回一个局部变量,即使用局部的变量绑定了一个引用也是错误的。
paschen 版主 2015-10-31
  • 打赏
  • 举报
回复
都能通过编译,但不要返回局部变量的引用
dustpg 2015-10-31
  • 打赏
  • 举报
回复
int多没意思, 换std::string试试, 教材上都用的是"腐败"这个词. 腐败的引用

64,654

社区成员

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

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