函数返回引用思考

-bootblack- 2016-03-13 11:01:34
class
{
int a;
...
int & func() const;
};

int & func() const
{
return a;
}

这是一个简单的返回引用的问题,小弟有2点不是很明白,恳请大神指导~
问题1:既然这里是个返回引用,为什么不是写成return a &;这种形式?
问题2:编译器是不是自动创建一个匿名变量(假设就是temp), int & temp = a;
然后实际上返回的就是return temp;这个匿名的变量是保存在栈中,随着函数返回成功以后自动由编译器清除...可以这样理解吗?
...全文
109 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2016-03-15
  • 打赏
  • 举报
回复
返回值表达式如果是 引用变量, 也可以是函数局部的引用变量, 只要所引用的对象,不是函数局部非静态变量对象就可以了。
lm_whales 2016-03-15
  • 打赏
  • 举报
回复
返回引用的函数返回值表达式 对于非函数类型引用, 可以是 1)仅有一个对象变量的表达式。 对象变量,或者数组元素(对象) 有全局变量,文件静态变量,函数静态变量,类静态变量 如果函数是类的非静态函数,还可以是 类的非静态成员变量 2) 仅有一个引用变量的表达式。 有这么几种: 函数的形参(必须是个引用类型的参数) 以及如下来源的引用变量(他们引用的对象,和对象变量 的来源相同) 有全局变量,文件静态变量,函数静态变量,类静态变量 如果函数是类的非静态函数,还可以是 类的非静态成员变量 3) 指针解引用表达式 例如 *this , *p,*(p+1) 要求指针必须指向 函数结束后,生命周期没有结束的对象。 4)常量表达式(返回值类型为 常量引用) 常量引用,可以绑定到常量表达式。 5)强制转换后是个引用类型的强制转换表达式。 以上各种情况,都必须 跟返回值的类型相匹配。否则 编译会出错。 PS: return expr; 是个返回语句 其中 expr 是个返回值表达式。 函数中返回的,是返回值表达式expr 的值, 它可能是某个对象(的值),或者是对象的引用, 也可能只是一个值(常量表达式,或者 编译器生成的临时对象的值)。
-bootblack- 2016-03-14
  • 打赏
  • 举报
回复
引用 4 楼 fefe82 的回复:
问题二: 所有的返回都是这样处理的。不只是引用。 但是,不是 return temp; 而是 在 return a; 的时候,用 a 初始化 temp(返回值)。 如果返回值是引用,那么这一初始化的过程就是引用绑定。 所以,对问题一:引用是直接绑定到一个对象的,返回的引用可以直接绑定到 a 上,不需要类似 a& 的语法。
感谢大神指导~
lm_whales 2016-03-14
  • 打赏
  • 举报
回复
引用是别名,你要返回张三的引用,自然只需要返回张三就可以了
super_admi 2016-03-14
  • 打赏
  • 举报
回复
我觉得,你可以这样来理解: 你去商店里买东西,你告诉售货员“你要买什么,然后付钱”(这就是你传入的参数),然后售货员“给你一个盒子,盒子装了你要的东西”,这个就是返回值。 但有一个问题是,这个商店,其实是存在于二次元空间的,一般情况下,盒子到了你手里之后,一段时间后,就会自动消失(局部变量作用域),所以,通常情况下,你需要对这个盒子释放一个COPY魔法,在你的世界中重建这个盒子(比如地球上的3D打印)。 OK,下面是你的关注点:引用。有些特殊情况,你不需要释放COPY魔法。情况1:因为这个盒子是一个神器(static, const等数据),你拿到盒子后,其实盒子是不会消失的,你不用COPY魔法,这就是“引用”。当然,如果你COPY一下也没问题,但这个盒子,已经不是原来的盒子了。情况2:你自带了盒子给售货员,然后售货员装东西后返回给你的也是这个盒子,那么这个盒子同样不是消失,你也可以不适用COPY魔法。
paschen 版主 2016-03-14
  • 打赏
  • 举报
回复
返回引用是让接收的变量绑定到a,而你的a并不是一个局部变量,而是成员变量,不会随函数结束而销毁
fefe82 2016-03-14
  • 打赏
  • 举报
回复
问题二: 所有的返回都是这样处理的。不只是引用。 但是,不是 return temp; 而是 在 return a; 的时候,用 a 初始化 temp(返回值)。 如果返回值是引用,那么这一初始化的过程就是引用绑定。 所以,对问题一:引用是直接绑定到一个对象的,返回的引用可以直接绑定到 a 上,不需要类似 a& 的语法。
哈利_蜘蛛侠 2016-03-13
  • 打赏
  • 举报
回复
第二点是对的。第一点,并没有a&这样的表达式把……给一个引用变量赋值的时候,右边的就是一个普通的变量(或者其他的左值)。
lm_whales 2016-03-13
  • 打赏
  • 举报
回复
引用是对一个对象的引用, 所以返回对象,就能够返回他的引用。 不需要任何其他符号

64,648

社区成员

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

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