永发信息网

返回引用的问题

答案:3  悬赏:30  手机版
解决时间 2021-03-07 15:49
  • 提问者网友:咪咪
  • 2021-03-07 04:36
#include <stdio.h>

int t;

int fun(int a)
{
int temp = a;
return temp;
}

int fun1(int a)
{
t = a;
return t;
}

int main(int argc, char *argv[])
{
int b = 1;
int c = fun(b);
printf("%d\n",c);
int &d = fun1(b); //为什么执行到这步的时候会出现不能将局部变量的值返回给引用呢?t是全局变量啊,将全局变量返回赋值给一个引用不可以么?
printf("%d\n",d);
return 0;
}

请看注释中的问题
最佳答案
  • 五星知识达人网友:千夜
  • 2021-03-07 05:00
你好!之所以提示以上的错误信息,是因为return t;不是返回的t这个对象,而是返回的t的值。即,等价于 int temp =t; return temp;

为了能够赋值,不妨将fun1函数的返回类型修改为 int&,返回引用对象。
全部回答
  • 1楼网友:毛毛
  • 2021-03-07 06:21
int &d = fun1(b); 这句话编译时出错,因为等号左边是一个int型引用,而右边是int型。应该将函数int fun1(int a)更改为int & fun1(int a);使得右边函数调用后也是返回了一个引用,调试通过
  • 2楼网友:雾月
  • 2021-03-07 05:10
这要从函数的调用过程分析,你应该知道,一个函数的参数如果不是引用的话,那么这个参数仅仅是一个值的拷贝,在函数体内对参数的任何操作不会影响这个参数的原值。对于函数的返回值,如果不是引用,那么只是暂时性的,举个例子,一个函数返回了一个int变量,那么当这个变量返回给外部使用后,这个变量的内存就立刻被系统回收了,也就是说这个值再也不存在了。 如果返回一个类的对象的话,建议还是把返回值写成引用的形式,这样做有两个好处,第一个是保证了返回的类一定是存在的,否则有可能已经被析构了导致错误,第二个是提高了程序的效率,因为省去了复制的过程,这是因为函数返回后,系统产生一个匿名对象,并复制为返回的对象,之后你使用的都是这个匿名对象,原先返回的对象早就不存在了,举个例子,这是函数申明:a f(void);,其中a是一个类,a有一个成员对象member,那么可以这么写:f().member,意思是调用f的返回值的member变量。其实你的返回值早就被析构了,你之所以可以这么用,是因为系统生成了一个匿名类对象,并复制成返回的那个类对象,所以你才可以这么用。有些复杂,不知道明白了没有,因为这个确实不是很好理解。 至于返回一个类的指针,那就更不对了,因为在函数中使用了对象都会被析构,所以这个返回的指针实际上是一个野指针,几乎注定要崩溃,除非你所指向的类对象是一个static静态属性的。 而引用就不一样了,引用告诉了计算机,你不必给我复制一个副本,直接给我把本人叫来,我要亲自操作它!系统知道有地方还要使用这个类对象,所以不会产生一个匿名类对象,而原先的返回值也不会被析构。 引用的唯一隐患就是安全性的问题,因为你是直接操作原始数据,所以一旦发生误操作,结果是无可避免的,这就是为什么用const来修饰引用的参数,这样保证了被引用的变量无法修改,同时提高了程序的运行效率
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯