C++讲义第八章 引用_第1页
C++讲义第八章 引用_第2页
C++讲义第八章 引用_第3页
C++讲义第八章 引用_第4页
C++讲义第八章 引用_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8第八章引用

§8.1引用的概念第八章目录

§8.3用引用传递函数参数

§8.2引用的操作§8.4返回多个值的函数调用§8.5常引用§8.6返回堆中变量的引用第八章小结函数参数可以通过传值和传址两种方式调用函数。还可以通过引用传递参数。本章介绍引用的概念,用引用传递函数的方法,明确引用与指针的区别。第八章引用(Reference)在程序中,引用可作为目标变量或对象的别名而使用,对引用的操作实际上就是对目标变量或对象的操作。建立引用的方法:

intvalue;int&rvalue=value;//rvalueinitialized说明rvalue是对整型数据的引用,并初始化为整型变量value的引用。§8.1引用的概念Areferenceisanalternativenameforvariableorobject.Toensurethatareferenceisboundtoavariablenameoranobjectname,wemustinitializethereference.注意1、引用在说明时必须初始化,初始化变量必须是已定义的变量;2、引用不是变量,只是替代某个变量的别名;3、引用不占内存空间,引用的地址与绑定的变量相同。在程序中对引用的访问就是对其绑定的变量的访问。#include<iostream.h>voidmain(){intintone;int&rint=intone;intone=5;cout<<“intone=”<<intone<<endl;cout<<“rint=”<<rint<<endl;rint=25;cout<<“intone=”<<intone<<endl;cout<<“rint=”<<rint<<endl;}运行结果为:

intone=5rint=5intone=25rint=25例如:下面程序说明引用与其绑定的变量之间的关系。注意:引用运算符与取地址运算符使用了相同符号“&”,但使用场合不同,意义不同;引用运算符“&”仅在说明一个引用时使用,放在类型名后面,表示是该数据类型的引用;在程序中,“&”作为取地址操作运算符,放在变量前面。例如:intcount;int&sum=count;//引用说面intcount;int*ip=&count;//取地址,对指针初始化cout<<&ip;//输出变量ip的地址cout<<&count;//输出变量count的地址如果程序中取引用的地址,它返回引用绑定的目标变量的地址;(2)对引用赋值,就是对绑定的目标变量的赋值;(3)若说明一个引用为T&,则引用必须用类型T的目标变量,或能转换成类型T的目标变量进行初始化。例如下面的说明语句是合法的,

double&rr=1;

因为整型1可以转换为double,此种情况下:首先作必要的类型转换;然后将结果置于临时变量;最后把临时变量的地址作为初始化的值。所以该说明语句可以解释成:

doubletemp;temp=double(1);double&rr=temp;§8.2引用的操作(4)可以说明对指针变量的引用,例如:

int*a;int*&p=a;//说明p为整型指针的引用

intb=8;p=&b;//p是a的别名,是一个指针(5)不能建立数组的引用,例如:

inta[10];int&ra[10];//错误(6)引用不能用类型初始化,例如:

int&ra=int;

#include<iostream.h>voidmain(){intone;int&rone=one;one=5;cout<<“one:”<<one<<endl;cout<<“rone:”<<rone<<endl;cout<<“&one:”<<&one<<endl;cout<<“&rone:”<<&rone<<endl;inttwo=28;rone=two;//等价于one=two;cout<<“one:”<<one<<endl;cout<<“two:”<<two<<endl;下面程序说明引用与其绑定的变量间的赋值及地址间的关系。

cout<<“rone:”<<rone<<endl;cout<<“&one:”<<&one<<endl;cout<<“&two:”<<&two<<endl;cout<<“&rone:”<<&rone<<endl;}

输出结果:one:5rone:5&one:0110:F150&rone:0110:F150one:28two:28rone:28&one:0110:F150&two:0110:F14E&rone:0110:F150注意

引用被重新赋值后,引用地址仍然绑定在目标变量地址上。即引用被初始化后不会指向其他不同的变量。在函数调用中,已经介绍了传值和传址两种方式进行函数调用的特点。使用引用传递参数也可以进行函数调用。其方法是,使用传址调用的机理,采用传值调用的形式,这样既实现了双向传送,又增加了程序的可读性。下面以swap函数为例说明函数调用的三种方式。§8.3用引用传递函数参数方式调用形式参数的形式传值(单向)swap(a,b)swap(intx,inty)传址(双向)swap(&a,&b)swap(int*x,int*y)引用(双向)swap(a,b)swap(int&x,int&y)下面的程序用引用改写swap()函数的调用方式。#include<iostream.h>voidswap(int&x,int&y);voidmain(){intx=5;inty=6;cout<<“beforeswap,x=”<<x<<“,y=”<<y<<endl;swap(x,y);cout<<“afterswap,x=”<<x<<“,y=”<<y<<endl;}voidswap(int&rx,int&ry){inttemp;temp=rx;rx=ry;ry=temp;}注意:引用可能存在调用的二义性问题。例如,下面程序代码中,两个重载函数的形参数分别为整型变量,和整型变量的引用。函数调用方式又不同,将引起编译错误。voidfn(ints){……}voidfn(int&t){……}voidmain(){inta=5;

fn(a);//无法确认调用哪一个fn()函数}结果:beforeswap,x=5,y=6afterswap,x=6,y=5使用传值调用方式调用函数时,函数只能返回一个值。如果需要从函数调用中返回两个以上的值,可以采用引用,和指针方式实现。取双向传递后的实参数值,即可达到这个目的。例如:下面程序返回三个值,两个是引用,另一个是函数返回值,函数返回值作为从键盘输入数据的正误判断。

§8.4返回多个值的函数调用#include<iostream.h>intfactor(int,int&,int&);voidmain(){intnumber,squared,cubed,error;cout<<“Enteranumber(0-20):”;cin>>number;error=factor(number,squared,cubed);if(error)cout<<“Errorencountered:\n”;else{cout<<“number:”<<number<<endl;cout<<“squared:”<<squared<<endl;cout<<“cubed:”<<cubed<<endl;}}intfactor(intn,int&rsquared,int&rcubed){if(n>20||n<0)return1;rsquared=n*n;rcubed=n*n*n;return0;}结果:Enteranumber(0-20):3number:3squared:9cubed:27使用const修饰符说明的引用称为常引用,该引用所引用的变量或对象不能被更改,其定义格式如下:

const<类型说明符>&<引用名>例如:

constfloat&r;其中r是一个常引用,它所引用的变量或对象的值不能被改变,因此程序中出现r=12.3这些赋值语句是非法的。使用常引用的好处是,既不会更改所引用的对象,保证数据的安全,又没有传值所需的实参向形参拷贝过程,这将会改善程序的运行效率。§8.5常引用例如:下面的程序传递一个常量引用#include<iostream.h>double&fn(constdouble&pd);{staticdoublead=50;//staticlocalvariablead+=pd;cout<<“fnbeingcalled,thevalueis:”<<pd<<endl;returnad;}voidmain(){doublea=200.8;double&m=fn(a);cout<<m<<endl;a=30.0;m=fn(a);cout<<m<<endl;}结果:fnbeingcalled,thevalueis:200.8250.8fnbeingcalled,thevalueis:30.0280.8如果将上面的程序改为传递一个常量指针,返回一个指针,则程序如下:#include<iostream.h>double*fn(constdouble*pd)//形参为指针{staticdoublead=50;ad+=*pd;cout<<“fnbeintcalled,thevalueis:”<<*pd<<endl;return&ad;}voidmain(){doublea=200.8;constdouble*m=fn(&a);//传实参a的地址cout<<*m<<endl;a=30.0;m=fn(&a);cout<<*m<<endl;}结果:fnbeingcalled,thevalueis:200.8250.8fnbeingcalled,thevalueis:30.0280.8对引用的初始化,可以是变量,可以是常量,也可以是一定类型的堆空间变量。用堆空间变量初始化的引用,要求不使用该引用时要释放堆空间。§8.6返回堆中变量的引用#include<iostream.h>intcirclearea(){double*pd=newdouble;if(!pd)

{cout<<“errormemoryallocation!”;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论