版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、8 8.1 引用的概念引用的概念第八章第八章 目目 录录 8.3 用引用传递函数参数用引用传递函数参数 8.2 引用的操作引用的操作8.4 返回多个值的函数调用返回多个值的函数调用8.5 常引用常引用8.6 返回堆中变量的引用返回堆中变量的引用第八章小结第八章小结 函数参数可以通过传值和传址两种方式调用函数参数可以通过传值和传址两种方式调用函数。还可以通过引用传递参数。函数。还可以通过引用传递参数。 本章介绍引用的概念,用引用传递函数的方本章介绍引用的概念,用引用传递函数的方法,明确引用与指针的区别。法,明确引用与指针的区别。 在程序中,引用可作为目标变量或对象的别名而使用,对在程序中,引用可
2、作为目标变量或对象的别名而使用,对引用的操作实际上就是对目标变量或对象的操作。引用的操作实际上就是对目标变量或对象的操作。 建立引用的方法:建立引用的方法: int value; int& rvalue=value; / rvalue initialized 说明说明rvalue 是对整型数据的引用,并初始化为整型变量是对整型数据的引用,并初始化为整型变量value 的引用。的引用。注注 意意1、引用在说明时必须初始化,初始化变量必须是已定、引用在说明时必须初始化,初始化变量必须是已定义的变量;义的变量;2、引用不是变量,只是替代某个变量的别名;、引用不是变量,只是替代某个变量的别名;
3、3、引用不占内存空间,引用的地址与绑定的变量相同。、引用不占内存空间,引用的地址与绑定的变量相同。在程序中对引用的访问就是对其绑定的变量的访问。在程序中对引用的访问就是对其绑定的变量的访问。 #include void main( ) int intone; int& rint=intone; intone=5; cout“intone”intoneendl; cout“rint”rintendl; rint=25; cout“intone”intoneendl; cout“rint”rintendl; 运行结果为:运行结果为: intone=5 rint=5 intone=25 ri
4、nt=25例如:下面程序说明引用与其绑定的变量之间的关系。例如:下面程序说明引用与其绑定的变量之间的关系。注意:注意: 引用运算符与取地址运算符使用了相同符号引用运算符与取地址运算符使用了相同符号“&”,但使用,但使用场合不同,意义不同;场合不同,意义不同; 引用运算符引用运算符“&”仅在说明一个引用时使用,放在类型名后仅在说明一个引用时使用,放在类型名后面,表示是该数据类型的引用;在程序中,面,表示是该数据类型的引用;在程序中,“&”作为取地址操作为取地址操作运算符,放在变量前面。例如:作运算符,放在变量前面。例如: int count; int& sum=c
5、ount; /引用说面引用说面 int count; int *ip=&count; /取地址,对指针初始化取地址,对指针初始化 cout&ip; /输出变量输出变量ip 的地址的地址 cout&count; /输出变量输出变量count 的地址的地址(1) 如果程序中取引用的地址,它返回引用绑定的目标变量的如果程序中取引用的地址,它返回引用绑定的目标变量的地址;地址;(2) 对引用赋值,就是对绑定的目标变量的赋值;对引用赋值,就是对绑定的目标变量的赋值;(3) 若说明一个引用为若说明一个引用为T&,则引用必须用类型,则引用必须用类型T的目标变量,的目标变量,或
6、能转换成类型或能转换成类型T的目标变量进行初始化。例如下面的说的目标变量进行初始化。例如下面的说明语句是合法的,明语句是合法的, double& rr=1; 因为整型因为整型1可以转换为可以转换为double,此种情况下:,此种情况下: 首先作必要的类型转换;首先作必要的类型转换; 然后将结果置于临时变量;然后将结果置于临时变量; 最后把临时变量的地址作为初始化的值。最后把临时变量的地址作为初始化的值。 所以该说明语句可以解释成:所以该说明语句可以解释成: double temp; temp=double(1); double& rr=temp;(4) 可以说明对指针变量的引用
7、,例如:可以说明对指针变量的引用,例如: int *a; int*& p=a; /说明说明p为整型指针的引用为整型指针的引用 int b=8; p=&b; /p是是a的别名,是一个指针的别名,是一个指针(5) 不能建立数组的引用,例如:不能建立数组的引用,例如: int a10; int& ra10; /错误错误(6) 引用不能用类型初始化,例如:引用不能用类型初始化,例如: int& ra=int; #include void main( ) int one; int& rone=one; one=5; cout“one:”oneendl; cout“
8、rone:”roneendl; cout“&one:”&oneendl; cout“&rone:”&roneendl; int two=28; rone=two; /等价于等价于one=two; cout“one:”oneendl; cout“two:”twoendl; cout“rone:”roneendl; cout“&one:”&oneendl; cout“&two:”&twoendl; cout“&rone:”&roneendl; 输出结果:输出结果:one:5rone:5&one:0110:F15
9、0&rone:0110:F150one:28two:28rone:28&one:0110:F150&two:0110:F14E&rone:0110:F150注注 意意 引用被重新赋值后,引用被重新赋值后,引用地址仍然绑定在目引用地址仍然绑定在目标变量地址上。即引用标变量地址上。即引用被初始化后不会指向其被初始化后不会指向其他不同的变量。他不同的变量。 在函数调用中,已经介绍了传值和传址两种方式进行函数在函数调用中,已经介绍了传值和传址两种方式进行函数调用的特点。使用引用传递参数也可以进行函数调用。其方法调用的特点。使用引用传递参数也可以进行函数调用。其方法是,使
10、用传址调用的机理,采用传值调用的形式,这样既实现是,使用传址调用的机理,采用传值调用的形式,这样既实现了双向传送,又增加了程序的可读性。了双向传送,又增加了程序的可读性。 下面以下面以swap 函数为例说明函数调用的三种方式。函数为例说明函数调用的三种方式。方方 式式调用形式调用形式参数的形式参数的形式传值传值(单向单向)swap(a,b)swap(int x,int y)传址传址(双向双向)swap(&a,&b)swap(int *x,int *y)引用引用(双向双向)swap(a,b)swap(int &x,int &y)#includevoid swap(
11、int& x, int& y);void main( ) int x=5; int y=6; cout“before swap, x=”x“,y=”yendl; swap(x,y); cout“after swap, x=”x“,y=”yendl;void swap(int& rx, int& ry) int temp; temp=rx; rx=ry; ry=temp;注意:注意:引用可能存在调用的二义性问题。例如,下面程序代引用可能存在调用的二义性问题。例如,下面程序代码中,两个重载函数的形参数分别为整型变量,和整型变量码中,两个重载函数的形参数分别为整型变量
12、,和整型变量的引用。函数调用方式又不同,将引起编译错误。的引用。函数调用方式又不同,将引起编译错误。void fn(int s) void fn(int& t) void main( ) int a=5; fn(a); /无法确认调用哪一个无法确认调用哪一个fn( )函数函数结果:结果:before swap, x=5,y=6after swap, x=6,y=5 使用传值调用方式调用函数时,函数只能返回一个值。使用传值调用方式调用函数时,函数只能返回一个值。 如果需要从函数调用中返回两个以上的值,可以采用如果需要从函数调用中返回两个以上的值,可以采用引用,和指针方式实现。引用,和指针
13、方式实现。 取双向传递后的实参数值,即可达到这个目的。取双向传递后的实参数值,即可达到这个目的。例如:下面程序返回三个值,两个是引用,另一个是函数例如:下面程序返回三个值,两个是引用,另一个是函数返回值,函数返回值作为从键盘输入数据的正误判断。返回值,函数返回值作为从键盘输入数据的正误判断。 #include int factor(int,int&,int&); void main( ) int number,squared,cubed,error; coutnumber; error=factor(number,squared,cubed); if(error) cout“E
14、rror encountered:n”; else cout“number:”numberendl; cout“squared:”squaredendl; cout“cubed:”cubed20|n0) return 1; rsquared=n*n; rcubed=n*n*n; return 0;结果:结果:Enter a number(0-20):3number:3squared:9cubed:27 使用使用const 修饰符说明的引用称为常引用,该引用所引用的修饰符说明的引用称为常引用,该引用所引用的变量或对象不能被更改,其定义变量或对象不能被更改,其定义格式如下格式如下: const &
15、amp; 例如:例如: const float& r ; 其中其中r 是一个常引用,它所引用的变量或对象的值不能被是一个常引用,它所引用的变量或对象的值不能被改变,因此程序中出现改变,因此程序中出现 r =12.3 这些赋值语句是非法的。这些赋值语句是非法的。 使用常引用的好处是,既不会更改所引用的对象,保证数使用常引用的好处是,既不会更改所引用的对象,保证数据的安全,又没有传值所需的实参向形参拷贝过程,这将会改据的安全,又没有传值所需的实参向形参拷贝过程,这将会改善程序的运行效率。善程序的运行效率。例如:下面的程序传递一个常量引用例如:下面的程序传递一个常量引用#includedou
16、ble& fn(const double& pd); static double ad=50; /static local variable ad+=pd; cout“fn being called,the value is:”pdendl; return ad;void main( ) double a=200.8; double& m=fn(a); coutmendl; a=30.0; m=fn(a); coutmendl;结果:结果:fn being called, the value is:200.8250.8fn being called, the value
17、 is:30.0280.8 如果将上面的程序改为传递一个常量指针,返回一个指针,如果将上面的程序改为传递一个常量指针,返回一个指针,则程序如下:则程序如下:#includedouble* fn(const double* pd) /形参为指针形参为指针 static double ad=50; ad+=*pd; cout“fn beint called, the value is:”*pdendl; return &ad; void main( ) double a=200.8; const double* m=fn(&a); /传实参传实参a 的地址的地址 cout*mendl; a=30.0; m=fn(&a); cout*mendl;结果:结果:fn being called, the value is:200.8250.8fn being called, the value is:30.0280.8#include int circlearea( ) double *pd=new double; if(!pd) cout“error memory allo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 黑龙江大庆市2026年国家级检验检测机构资质认定评审员考试试题及答案
- 广西北海市2026年国家级检验检测机构资质认定评审员考试试题及答案
- 2026年趣味百科知识竞赛题及答案试卷及答案
- 2026年湖北省黄冈市农业专业技术职务水平能力测试(农学)经典试题及答案
- 2026税务自查报告(3篇)
- 护理交接班制度相关试题及答案
- 2026年塔什库尔干县库科西鲁格乡村组道路建设项目水土保持报告表
- 河南省焦作市2025-2026学年高一数学上学期10月质量调研试题【含答案】
- 机械操作规范细则
- 某冶金厂物料管控办法
- 2026中国地质大学(北京 )招聘备考题库(第二批)附答案详解(培优a卷)
- 珠海市2025广东横琴粤澳深度合作区执行委员会招26人笔试历年参考题库典型考点附带答案详解
- 2026年合肥复兴控股集团有限公司第一批人员招聘36名笔试备考题库及答案解析
- JJF 2396-2026高通量基因测序仪校准规范
- 2026年安全生产月主题班会教育课件:人人讲安全 个个会应急
- 初中数学考试命题趋势分析
- 2026年国家开放大学电大《人力资源管理》期末练习题附参考答案详解(典型题)
- XJJ013-2012 新疆维吾尔自治区城市规划管理技术规定
- 八条硬措施深度解析
- 中医肛痈护理试题(附答案)
- 幼儿园飞机科普
评论
0/150
提交评论