资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,第十七讲:引用与内存管理,1,课程内容安排,引用,引用的操作,动态内存分配,const,引用,指针与引用的区别,综合练习,思考和习题,2,引用,引用引入了对象的一个同义词,引用只是绑定的对象的另一名字,作用在引用上的所有操作事实上都是作用在该引用绑定的对象上。,简单来说,引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。如果对引用进行输出、赋值等操作,其执行如图,17-1,所示。,3,定义命名空间,C+,中,有两种形式的命名空间,有名的命名空间和无名的命名空间。标准,C+,中,命名空间的定义格式为:,有名的命名空间:,namespace,命名空间名,声明序列,无名的命名空间:,namespace,声明序列,4,声明引用,引用其实是变量的另一个名字。因此,与变量同样的,在使用引用前也需要对其进行声明,引用的声明语句如下:,类型标识符,&,引用名,=,目标变量名;,例如,下列语句声明了一个对整型变量,a,的引用,ra,。,int a;,int /,定义引用,ra,它是变量,a,的引用,即别名,5,引用的操作,引用只是某个变量或目标的同义词 ,引用的两个主要用途:,作为函数参数,从函数中返回值。,6,引用作为函数参数,下面定义了函数,swap(),,其定义的形式参数,p1,和,p2,就是引用,而在,main(),函数中调用,swap(),函数 。,7,代码清单,1#include ,2void s &p1, int &p2)/,此处函数的形参,p1, p2,都是引用,3,4int p; /,定义整型变量,p,5p=p1; /,交换两个变量的值,6p1=p2;,7p2=p;,8,9void main(),10,11int a,b;,12coutPlease input 2 number: ab;/,输入,a,b,两变量的值,14coutBefore swap:endl;,15couta= aendl;/,输出交换前的值,16coutb= bendl;,17s);/,直接以变量,a,和,b,作为实参调用,swap,函数,18coutAfter swap:endl;,19couta= aendl;/,输出结果,20coutb= bendl;,21,8,引用作为返回值,使用引用返回函数值。引用作为函数的返回值对函数有一定的要求,其要求函数定义时要按以下格式来定义:,类型标识符 &函数名(形参列表及类型说明),函数体,注意:以引用返回函数值,定义函数时需要在函数名前加“&”符号。用引用返回一个函数值的最大好处是在内存中不产生被返回值的副本。,9,动态内存分配,态内存分配是指在程序运行期间根据实际需要随时申请内存,并在不需要时释放,这样可以节省内存空间,提高程序运行效率。,C+,中,提供了两种运算符进行动态内存管理:,new,和,delete,运算符。将,new,运算符与,delete,运算符一起使用,就可以直接进行动态内存的申请和释放。,10,申请动态内存,C+中,new运算符用于申请所需的内存单元,返回指定类型的一个指针,在有些参考资料中也称为创建内存单元。一般来说,new运算符的语法格式为:,指针=new 数据类型;,其中,指针应预先声明,指针指向的数据类型与new后的数据类型相同。若申请成功,则返回分配单元的首地址给指针;否则(比如没有足够的内存空间),则返回0(一个空指针)。例如,下列语句申请一个整型数据空间:,int *p;,p=new int;,11,释放空间,与new运算符相反的,delete运算符是释放new申请到的内存。也即当程序中不再需要使用运算符new创建的某个内存单元时,就必须用运算符delete来删除它,其语法格式为:,delete 指针; /释放非数组内存单元,delete常量 指针; /释放数组内存单元,其中,指针是指向需要释放的内存单元的指针的名字。并且delete只是删除动态内存单元,并不会将指针本身删除。,12,const引用,const引用表示指向const对象的引用,而非const引用表示指向非const对象的引用。例如,下面语句定义了常量ival和const引用:,const int ival =1024; /定义const常量ival,const int /引用和对象都是 const,如果定义了一个非const引用,将const对象赋给该引用时,这是非法的,因为对引用的修改将改变const对象的值,而const对象是不能改变值的。,13,指针与引用的区别,指针其实就是一个变量,和其他类型的变量是一个样子的,其是一个占用四字节的变量(32位机上),它与其他变量的不同之处就在于它的变量值是一个内存地址,指向内存的另外一个地方。而引用则是变量的一个别名。,注意:一个指针变量可以指向NULL,表示它不指向任何变量地址,但是引用必须在声明的时候就得和一个已经存在的变量相绑定,而且这种绑定不可改变。,14,综合练习,在,C+,程序设计中,内存的动态分配是应用较多的,尤其是在包含类的时候,下面综合练习显示了运算符,new,和,delete,的基本用法。,15,思考和习题,C+,中为什么要引入引用的概念?其是如何定义的?,引用在,C+,程序中用作参数函数和返回值,分别是如何实现的?,为什么,C+,中已经有动态内存分配的标准库函数了,还要引入运算符,new/delete,,其相比较有什么优点?,const,引用与普通引用的区别在于?,指针与引用的区别在于?,16,
展开阅读全文