百科狗-知识改变命运!
--

返回引用到底啥意思

是丫丫呀1年前 (2023-12-03)阅读数 10#综合百科
文章标签变量函数

1、如果单纯的从返回值来看,返回引用,除了减少个把临时变量的产生之外,没什么大不了的。

2、返回引用,更主要的目的是楼上说的,为了左值运算。

就你说的那个销毁问题,实际上,

不管是 int f( int& x ) 还是 int& f( int& x ) 中的 x,在 f函数结束后,都不可能销毁的,因为它本来传入的时候就是一个引用类型,它不是值类型。

引用是什么?引用是别名,只是在f函数结束后,x这个别名失效了而已,x所代表的变量,仍然还存在。因为它存在于调用f函数之前的作用域里,至于x所代表的变量什么时候被销毁,在这处 int f( int& x ) 函数中是绝对看不出的。

如果返回引用,那么我们可以有这样的应用。

比如有函数 int& f( int& x ) { return x; }

那么,我们调用的时候,可以写这样的代码

int a;

f( x ) ++;

如果 f 函数不是返回引用的话,f( x ) ++ 语法虽然没有错,但是结果不会保存到 a 中,这就是一个左值功能的应用。

楼上几位说的基本详细了,就是返回引用的意思,指返回值是一个引用。你老师说错了。

所谓返回引用是指返回一个已存在对象的引用,(切记一定要是已经存在的)

所谓引用其实就是包装指针的一个语法糖,

所谓语法糖就是说使用引用的地方用指针也可以实现,只不过要写更多的代码。

教科书上对引用这种数据类型讲得很简单,用它给变量起“别名”的作用甚至让人觉得它是多余的!

其实它真正的用武之地是在参数传递中!

众所周知在C语言中不论是从实参到形参,还是从局部变量到返回值,都是清一色的值传递。

值传递意味着全拷贝,不仅效率低下,更多的时候它也并非是你想要的语义。

试想你要去月球,现在从你身上取一个细胞克隆出一个与你同样的人,让它去完成你的探月计划,

然后回来给你讲它的所感所受,或许你能听得身临其境,并且它的成功证明换成你也行,但这是你想要的吗?

T fun(T t){return t;} void main() {T t; t=fun(t);}

在上面的代码中你能发现几个变量?

1.主函数main()中定义了局部变量t

2.调用fun()函数时,自动产生一个局部变量(也就是形参表中的变量t)用于接受实参的值

3.函数fun()返回它自己的形参变量t时,又自动了产生一个匿名临时变量用于存放返回值

T& fun(T& t){return t;} void main() {T t; t=fun(t);}

与上面的代码相比较,不存在第2个和第3个变量。

使用引用常见有以下几种情形:(很不全面,抛砖引玉)

情形一:返回函数实参 T& fun(T& t){return t;}

情形二:返回静态变量 T& fun(){static T t; return t;}

返回引用到底啥意思

情形三:返回当前对象 T& T::fun(){return *this;}

情形四:返回新建对象 T& fun(){return *new T;}

注意与最后一种情形类似但不等价的指针形式如下:

T& fun(){T* pt=new T(); return *pt;} //除非显式调用delete,否则对象(*pt)不会被释放!

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)