语法:类型 &函数名(形参列表){ 函数体 }

特别注意:

1.引用作为函数的返回值时,必须在定义函数时在函数名前将&

2.用引用作函数的返回值的最大的好处是在内存中不产生返回值的副本

//代码来源:RUNOOB
#include<iostream>
using namespace std;
float temp;
float fn1(float r){temp=r*r*3.14;return temp;
}
float &fn2(float r){ //&说明返回的是temp的引用,换句话说就是返回temp本身temp=r*r*3.14;return temp;
}
int main(){float a=fn1(5.0); //case 1:返回值//float &b=fn1(5.0); //case 2:用函数的返回值作为引用的初始化值 [Error] invalid initialization of non-const reference of type 'float&' from an rvalue of type 'float'//(有些编译器可以成功编译该语句,但会给出一个warning) float c=fn2(5.0);//case 3:返回引用float &d=fn2(5.0);//case 4:用函数返回的引用作为新引用的初始化值cout<<a<<endl;//78.5//cout<<b<<endl;//78.5cout<<c<<endl;//78.5cout<<d<<endl;//78.5return 0;
}

case 1:用返回值方式调用函数(如下图,图片来源:伯乐在线):

返回全局变量temp的值时,C++会在内存中创建临时变量并将temp的值拷贝给该临时变量。当返回到主函数main后,赋值语句a=fn1(5.0)会把临时变量的值再拷贝给变量a

case 2:用函数的返回值初始化引用的方式调用函数(如下图,图片来源:伯乐在线)

这种情况下,函数fn1()是以值方式返回到,返回时,首先拷贝temp的值给临时变量。返回到主函数后,用临时变量来初始化引用变量b,使得b成为该临时变量到的别名。由于临时变量的作用域短暂(在C++标准中,临时变量或对象的生命周期在一个完整的语句表达式结束后便宣告结束,也就是在语句float &b=fn1(5.0);之后) ,所以b面临无效的危险,很有可能以后的值是个无法确定的值。

 如果真的希望用函数的返回值来初始化一个引用,应当先创建一个变量,将函数的返回值赋给这个变量,然后再用该变量来初始化引用:

  int x=fn1(5.0);int &b=x;

 case 3:用返回引用的方式调用函数(如下图,图片来源:伯乐在线)

这种情况下,函数fn2()的返回值不产生副本,而是直接将变量temp返回给主函数,即主函数的赋值语句中的左值是直接从变量temp中拷贝而来(也就是说c只是变量temp的一个拷贝而非别名) ,这样就避免了临时变量的产生。尤其当变量temp是一个用户自定义的类的对象时,这样还避免了调用类中的拷贝构造函数在内存中创建临时对象的过程,提高了程序的时间和空间的使用效率。

case 4:用函数返回的引用作为新引用的初始化值的方式来调用函数(如下图,图片来源:伯乐在线)

这种情况下,函数fn2()的返回值不产生副本,而是直接将变量temp返回给主函数。在主函数中,一个引用声明d用该返回值初始化,也就是说此时d成为变量temp的别名。由于temp是全局变量,所以在d的有效期内temp始终保持有效,故这种做法是安全的。

3.不能返回局部变量的引用。如上面的例子,如果temp是局部变量,那么它会在函数返回后被销毁,此时对temp的引用就会成为“无所指”的引用,程序会进入未知状态。

4.不能返回函数内部通过new分配的内存的引用。虽然不存在局部变量的被动销毁问题,但如果被返回的函数的引用只是作为一个临时变量出现,而没有将其赋值给一个实际的变量,那么就可能造成这个引用所指向的空间(有new分配)无法释放的情况(由于没有具体的变量名,故无法用delete手动释放该内存),从而造成内存泄漏。因此应当避免这种情况的发生

5当返回类成员的引用时,最好是const引用。这样可以避免在无意的情况下破坏该类的成员。

6.可以用函数返回的引用作为赋值表达式中的左值

#include<iostream>
using namespace std;
int value[10];
int error=-1;
int &func(int n){if(n>=0&&n<=9)return value[n];//返回的引用所绑定的变量一定是全局变量,不能是函数中定义的局部变量 elsereturn error;
}int main(){func(0)=10;func(4)=12;cout<<value[0]<<endl;cout<<value[4]<<endl;return 0;
}

D.用引用实现多态

在C++中,引用是除了指针外另一个可以产生多态效果的手段。也就是说一个基类的引用可以用来绑定其派生类的实例

class Father;//基类(父类)
class Son:public Father{.....}//Son是Father的派生类
Son son;//son是类Son的一个实例
Father &ptr=son;//用派生类的对象初始化基类对象的使用

特别注意:

ptr只能用来访问派生类对象中从基类继承下来的成员如果基类(类Father)中定义的有虚函数,那么就可以通过在派生类(类Son)中重写这个虚函数来实现类的多态。

 

C/C++ 引用作为函数的返回值相关推荐

  1. 引用作为函数的返回值

    引用作为函数的返回值--原版 1.引用作为函数的返回值时,必须在定义函数时在函数名前将& 2.用引用作函数的返回值,的最大的好处是在内存中不产生返回值的副本 float temp; float ...

  2. C++_引用做函数的返回值_引用的本质---C++语言工作笔记032

    然后我们再去看,要注意不要反悔局部变量的引用什么意思? 比如这里我有个方法,test01,他返回了一个int a =10; 这个变量的引用,而a这个变量是个局部变量. 这个时候我们去用一个引用,接收这 ...

  3. c++为什么不能用局部变量的指针或者引用作为函数的返回值

    函数的调用以及完成调用的过程是函数在栈内存中入栈和出栈的过程,当函数被调用 时,函数入栈,当函数调用完成之后,系统负责把函数占用栈内存自动释放,所以存在 栈中的局部变量的占用的内存得到释放,如果此时把 ...

  4. python函数的返回值是返回引用吗_python-函数(上):函数返回值、函数调用、前向引用...

    编程方法: 1.面向对象:类--class 2.面向过程:过程--def 3.函数式编程:函数--def #python中函数#函数的定义#打印一个佛祖镇楼 -> 一个功能点的解释 defpri ...

  5. 【php7扩展开发四】函数的参数 ,引用传参 ,返回值

    函数参数解析 之前我们定义的函数没有接收任何参数,那么扩展定义的内部函数如何读取参数呢?用户自定义函数在编译时会为每个参数创建一个zend_arg_info结构,这个结构用来记录参数的名称.是否引用传 ...

  6. 引用之函数返回值 函数的返回值为引用类型《三》

    一: 可以把函数定义为引用类型,这时函数的返回值即为某一变量的引用(别名),因此,它相当于返回了一个变量,所以可对其返回 值进行赋值操作.这一点类同于函数的返回值为指针类型. 由于函数调用返回的引用类 ...

  7. 在c语言中怎么返回引用参数,C语言函数 函数的声明 C语言的头文件 #include的用法 形参和实参 函数的返回值 - 猫扑天空...

    C语言函数 一.是什么? 是指编程中对一块功能代码的封装,可以理解一个程序片段 二.有什么用? 可以封装代码,方便调用,提高复用性 三.怎么用? 定义:  返回值类型  函数名(形参类型 参数名1-. ...

  8. Qt 使用C++特性“引用” - 获得槽函数的返回值

    QT信号与槽中,槽函数是可以定义有返回值的,但是我们都是在connect函数中进行调用,那么该如何获得调用后的槽函数的返回值呢? 答案是不可能获得了的! 槽函数虽然可以定义返回值类型,但其实他和信号一 ...

  9. C++知识点8——函数的返回值

    函数的返回值不能是数组或函数,但是可以是是数组和函数的指针或引用 函数返回一个值的过程和初始化完全一致,先创建一个临时变量,用返回值初始化该临时变量,然后用该临时变量去初始化另一个变量或者给另一个变量 ...

最新文章

  1. MATLAB实现图像平移的源代码
  2. React Native 红屏之Could not connect to development server.
  3. oracle创建目录的命令,使用create database命令手工创建Oracle数据库
  4. 在 Mac App Store 上如何查看未完成的下载?
  5. 【限时免费】大千万象,“爬”你所需!老司机教你利用爬虫建造一座图书馆...
  6. SLAM_SLAM中一般是如何求解相机的运动的?
  7. 模板题——快排、归并、二分
  8. 公开的Webservice集锦
  9. 二分类变量相关性分析spss_SPSS教程 | 两个有序分类变量的相关分析及SPSS操作
  10. 计算机打印状态错误,打印机状态错误【设置办法】
  11. 电脑上微信怎么双开_【干货分享】电脑版微信怎么双开、多开~
  12. 北理工计算机学院奖学金公示,计算机学院2020年研究生国家奖学金拟推荐人选公示通知...
  13. 儿童节html5小游戏,2016六一儿童节主题班会小游戏大全
  14. 联想计算机管理员权限设置,联想电脑windows10管理员权限开启的4种方法
  15. select设置选中option
  16. 【Homebrew】Homebrew 介绍与安装
  17. JVM堆内存(heap)
  18. 【信息系统项目管理师】第十五章 知识产权与法律法规(考点汇总篇)
  19. 展锐T618/T610安卓4G核心板/开发板/方案定制
  20. RK3399 Android7.1修改安兔兔等第三方软件读到的内核版本信息

热门文章

  1. 家庭网关——开启数字家庭的钥匙
  2. 计算机毕业设计Java电影售票系统(源码+系统+mysql数据库+lw文档)
  3. python名片系统代码练习并存储到数据库中
  4. Python取某个目录下的所有的EXCEL
  5. OpenAI 强化学习 SpiningUP 中文文档 中文教程
  6. zoom如何使用网页版登录
  7. 2021年中国马铃薯种植生产情况及机械化程度分析:单产面积不断扩大,四川省产量居全国首位[图]
  8. Python-Django毕业设计钓鱼爱好者交流平台(程序+Lw)
  9. 常见的系统架构风格有哪些?各有什么优缺点?
  10. matlab set函数