“引用作为函数参数”与 “引用作为函数返回值”

一、引用作为函数参数

作为函数参数时引用有两种原因:
1、在函数内部会对此参数进行修改;2、提高函数调用和运行效率。

    关于第一点,都知道C++里提到函数就会提到形参和实参。如果函数的参数实质就是形参,不过这个形参的作用域只是在函数体内部,也就是说实参和形参是两个不同的东西,要想形参代替实参,肯定有一个值的传递。函数调用时,值的传递机制是通过形参=实参来对形参赋值达到传值目的,产生了一个实参的副本。即使函数内部有对参数的修改,也只是针对形参,也就是那个副本,实参不会有任何更改。函数一旦结束,形参生命也宣告终结,做出的修改一样没对任何变量产生影响。

例如:

void swap(int p1, int p2) //对两个变量进行交换处理。此处函数的形参为p1, p2,没有引用
{int p;p = p1;p1 = p2;p2 = p;}void main( )
{int a,b;cin >> a >> b; //输入a,b两变量的值swap(a,b); //直接以变量a和b作为实参调用swap函数cout << a << ' ' << b; //输出结果}

你会发现输出的ab还是你输入的值,没有交换。


如果我们改为:

void swap(int &p1, int &p2) //对两个变量进行交换处理。此处函数的形参为p1, p2都是引用
{int p;p = p1;p1 = p2;p2 = p;
}

再次执行,就会发现值交换了。原理就在于采用&p1&p2时,p1p2是实参的别名而已,像一个指针指向实参。改变p1p2就是改变实参的值。

    关于第二点,可以结合第一点分析,p1p2是实参的引用,不用经过值的传递机制,已经有了实参值的信息。所以没有了传值和生成副本的时间和空间消耗。当程序对效率要求比较高时,这是非常必要的.

 

二、引用作为函数返回值

说明:

1)以引用返回函数值,定义函数时需要在函数名前加&

2)用引用返回一个函数值的最大好处是,在内存中不产生被返回值的副本。

例如:
 

#include <iostream.h>
float temp; //定义全局变量temp
float fn1(float r); //声明函数fn1
float &fn2(float r); //声明函数fn2
float fn1(float r) //定义函数fn1,它以返回值的方法返回函数值
{temp=(float)(r*r*3.14);return temp;
}
float &fn2(float r) //定义函数fn2,它以引用方式返回函数值
{temp=(float)(r*r*3.14);return temp;
}
void main() //主函数
{float a=fn1(10.0); //第1种情况,系统生成要返回值的副本(即临时变量)float &b=fn1(10.0); //第2种情况,可能会出错(不同 C++系统有不同规定)//不能从被调函数中返回一个临时变量或局部变量的引用float c=fn2(10.0); //第3种情况,系统不生成返回值的副本//可以从被调函数中返回一个全局变量的引用float &d=fn2(10.0); //第4种情况,系统不生成返回值的副本//可以从被调函数中返回一个全局变量的引用cout<<a<<c<<d;
}

引用作为返回值,必须遵守以下规则:

1)不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。

2)不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak

3)可以返回类成员的引用,但最好是const。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常 量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350368.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue删除数组中的一条数据_删除排序数组中的重复项 II

删除排序数组中的重复项 II题目给定一个增序排列数组 nums &#xff0c;你需要在 原地 删除重复出现的元素&#xff0c;使得每个元素最多出现两次&#xff0c;返回移除后数组的新长度。不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的…

使用Docker堆栈部署的微服务-WildFly,Java EE和Couchbase

关于微服务的资料很多&#xff0c;只是用谷歌搜索就可以了 &#xff01; 几年前&#xff0c;我在比利时的Devoxx上发表了有关将单片重构为微服务的演讲&#xff0c;它得到了很好的评价&#xff1a; 该博客将展示Docker如何简化微服务的创建和关闭。 该博客中使用的所有代码都…

基于图像灰度的模板匹配

基于图像灰度的模板匹配 设模板图像T&#xff08;m*n&#xff09;&#xff0c;待匹配图像I&#xff08;M*N&#xff09;&#xff0c;两幅图像的原点都在左上角&#xff0c;这里有&#xff08;m<M&#xff0c;n<N&#xff09;。模板匹配的基本原理很简单&#xff1a;模板图…

学习activemq,在spring中activemq的配置信息

提供者&#xff1a; <?xml version"1.0" encoding"UTF-8"?><beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xmlns:jms"http://www.springframewor…

pca各个向量之间的相关度_PCA主成分分析

降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征&#xff0c;去除噪声和不重要的特征&#xff0c;从而实现提升数据处理速度的目的。降维的算法有很多&#xff0c;比如奇异值分解(SVD)、主成分分析(PCA)、因子分析(FA)、独立成分分析(ICA…

matlab 图像坐标系

matlab 图像中图像坐标系与plot、 imrotate坐标系的区别 图像坐标系是以图像左上角为原点&#xff0c;访问图像像素点img&#xff08;m&#xff0c;n&#xff09;&#xff0c;如下图所示&#xff1a; plot的坐标系&#xff0c;以图像左上角为原点&#xff0c;在图像中划线时&am…

matlab impyramid图像金字塔

B impyramid&#xff08;I, direction&#xff09; direction 可取‘reduce’或‘expand’&#xff0c;表示图像的宽度与高度缩小为原来的1/2与变大为原来的2倍

python你会吗_Python这些问题你会吗?

Python这些问题你会吗&#xff1f;final作用域的代码一定会被执行吗&#xff1f;正常的情况下&#xff0c;finally作用域的代码一定会被执行的&#xff0c;不管是否发生异常。哪怕是调用了sys.exit函数&#xff0c;finally也是会被执行的&#xff0c;那怎么样才能让finally代码…

perl大骆驼和小骆驼_你好骆驼:自动文件传输

perl大骆驼和小骆驼Apache Camel在其主页上 &#xff08;以及Camel用户指南中 &#xff09;将其描述为“基于已知企业集成模式的通用开源集成框架”。 Camel框架基于《 企业集成模式 》一书&#xff0c;并提供了该书中描述的模式的实现 。 我看一下这篇文章中使用Camel的“ Hel…

Django实战1-权限管理功能实现-01:搭建开发环境

1 项目开发环境 语言环境&#xff1a; python3.6.2 , django-2.1.2数据库环境&#xff1a;sqlite3(开发环境使用&#xff0c;部署环境使用mysql5.6)开发工具&#xff1a;pycharm2 安装python 说明&#xff1a;已经安装过python3.6环境的可以跳过此步。 python安装包下载地址&a…

matlab imhist灰度直方图

imhist()函数显示图像直方图要求图像是二维的灰度图像。 1.h imhist&#xff08;I&#xff09;:直接显示灰度图像I的直方图 2.h imhist(I,b):b是用来形成直方图的‘容器’的数目,默认256。 3.h imhist(X,map):显示索引图像的直方图&#xff0c;此直方图显示颜色映射图上色…

python语言程序设计计算机二级难不难_全国计算机二级的难度有多大?

计算机二级任选一科目考试及格即可获取计算机二级证书。自2019年3月考试起&#xff0c;二级语言类及数据库类科目(即除MS Office高级应用外的其他二级科目)调整获证条件为&#xff1a;总分达到60分且选择题得分达到50%及以上(即选择题得分要达到20分及以上)的考生方可取得合格证…

Jacobian 和Hessian矩阵

雅克比&#xff08;Jacobian matrix&#xff09;矩阵&#xff1a;目标函数f为一个函数向量&#xff0c;f(f1(x),f2(x),…fm(x))T&#xff0c;自变量x(x1,x2,…,xn)T&#xff1b;函数向量f对x求梯度&#xff0c;结果为一个矩阵&#xff1b;行数为f的维数&#xff1b;列数位x的维…

循环语句 for循环、while循环、do while循环

循环语句可以在满足循环条件的情况下&#xff0c;反复执行某一段代码&#xff0c;这段被重复执行的代码被称为循环体语句&#xff0c;当反复执行这个循环体时&#xff0c;需要在合适的时候把循环判断条件修改为false&#xff0c;从而结束循环&#xff0c;否则循环将一直执行下去…

获取按钮点击次数_无限次数使用,不会吧?不会吧?

就目前来说国内设计教程的网站虎课网还是很不错的里面的教程都很丰富但无奈的是普通用户每天只能学习一个课程想要学习多点就要充值而且会员只能开通年费对于只需偶尔学习一下的小伙伴来说可能太浪费了所以今天来大家分享一个超好用的浏览器插件官网看(适用平台&#xff1a;Chr…

现代化历险记:策略+将COBOL转换为Java的示例

在Keyhole Software&#xff0c;我们在很大程度上是一家现代化公司。 我们拥有一些顾问&#xff0c;他们专门研究将旧的代码迁移到新的&#xff0c;翻新的残旧代码库&#xff0c;并为大多数已经被供应商锁定的企业设计更光明的未来。 作为这些经验的有趣的副作用&#xff0c;我…

String类的特点和使用步骤

概述 java.lang.String 类代表字符串。Java程序中所有的字符串文字&#xff08;例如 "abc" &#xff09;都可以被看作是实现此类的实例 类 String 中包括用于检查各个字符串的方法&#xff0c;比如用于比较字符串&#xff0c;搜索字符串&#xff0c;提取子字符串以及…

Ostu最大类间差方法

Ostu方法又名最大类间差方法&#xff0c;通过统计整个图像的直方图特性来实现全局阈值T的自动选取&#xff0c;其算法步骤为&#xff1a; 1) 先计算图像的直方图&#xff0c;即将图像所有的像素点按照0~255共256个bin&#xff0c;统计落在每个bin的像素点数量 2) 归一化直方图…

pads 文本不能修改_斜框检测经典网络(文本)- R2CNN

论文题目&#xff1a;R2CNN&#xff1a;Rotational Region CNN for Orientation Robust Scene Text Detection论文来源&#xff1a;2017CVPR论文地址&#xff1a;https://arxiv.org/abs/1706.09579论文代码&#xff1a;https://github.com/DetectionTeamUCAS/R2CNN_Faster-RCNN…

【题解】炮兵阵地

【题解】炮兵阵地 luogu 题解 暴力状压记录上一行和上上行信息&#xff0c;暴力判断是否存在不合法的阵地&#xff0c;暴力滚动数组&#xff0c;暴力统计&#xff0c;暴力转移即可。 看了yyb代码&#xff0c;我感觉我不曾写过代码... 加入说不要那么暴力也可以&#xff0c;可以…