收藏 分销(赏)

面向对象技术与C--第二章.ppt

上传人:仙人****88 文档编号:13758155 上传时间:2026-04-10 格式:PPT 页数:76 大小:929KB 下载积分:10 金币
下载 相关 举报
面向对象技术与C--第二章.ppt_第1页
第1页 / 共76页
面向对象技术与C--第二章.ppt_第2页
第2页 / 共76页


点击查看更多>>
资源描述
,标题,主题,二级主题,三级主题,四级主题,五级主题,C,语言概述,目标,掌握,C+,的构成,在面向过程方面与,C,语言的兼容与扩充,内容,C+,的起源和特点,C+,源程序的构成,C+,在非面向对象方面的一些特性,C,的起源和特点,C,是,1972,年由,Denuis,Richie,在贝尔实验室设计的一个通用目的的程序设计语言,特点,结构化的程序设计语言,反映了设计者追求高效、灵活和强功能的设计思想,可以部分地取代汇编语言,具有较高地可移植性,提供了种类丰富地运算符和数据类型,缺点,类型检查机制相对较弱,本身几乎没有支持代码重用的机制,不适合于开发大型程序,C,的起源,为了兼容,C,,,1980,年贝尔实验室的,Bjarne,Stroutrstrup,博士及其同事设计了,C,特点,C,保持与,C,兼容,C,编写的程序可读性更好,代码结构更合理,使得软件的可重用性、可扩充性、可维护性和可靠性等方面有所提高,支持面向对象机制,可方便地构造出模拟现实问题的实体和操作,C,源程序的组成,C,程序的一般格式(,详见样例程序,),程序的运行,结论:书写的格式和,C,基本上没有什么区别,C,源程序的组成,C,程序是用,C,写成的,该源程序的后缀名应为,.,cpp,C,程序使用,C,编译器,C,程序使用,C,编译器,选择使用哪个编译器是由程序的后缀名决定的,C,编译器,C,编译器,C1.obj,C2.obj,连接器,连接器,C1.exe,C2.exe,C1.cpp,C2.c,源文件,目标文件,可执行文件,C,系统库,C,系统库,C,在非面向对象方面的一些特性,注释行,新的,I/O,流,灵活的局部变量说明,结构、联合、枚举名可直接作为类型名,const,修饰符,内置函数,函数原型,带有缺省参数的函数,函数重载,C,在非面向对象方面的一些特性,作用域运算符“:”,无名联合,强制类型转换,new,和,delete,引用,注释行,以“,/”,开始的注释内容只在本行起作用(,C,特有的),以“,/*.*/”,方式的注释为其之间的所有内容,,C,中不允许,/*/,嵌套使用,例:,/*this is a/*comment*/line*/,这不是一对,这是系统认为的一对,且是唯一的一对,新的,I/O,流,C,语言提供的,printf,(),和,scanf,(),的不安全性,C,提供了更安全和更方便的,I/O,方法,float f;,int,i;,scanf,(“%d”,f);,printf,(“%f”,i);,格式控制符与变量的类型不一致,变量,f,应该增加取地址符,&,float f;,int,i;,cin,f;,cout,”,允许用户连续输入一连串数据,并存入对应的变量中,如:,cin,abc,运算符“,”,允许用户连续输出一连串数据,如:,cout,a+bc;,使用,cin,或,cout,时,在程序中必须嵌入头文件,iostream.h,;,否则,编译报错,在,C,中,常用,n,实现换行,,C,中增加了换行控制符,endl,其作用与,n,一样,可参考,P81,该运算符也要满足运算符的优先级,请举一个例子用于说明优先级的问题?,新的,I/O,流,使用,cout,,,cin,输入输出数据时,全部使用了系统缺省的格式,程序的运行,当使用过一次非十进制的符号后,以后的输入输出都是以最近使用过的基制来决定,例,2_2,:,#include,void main(),int,x=25;,cout,十六进制为:,hexx,endl,;,cout,十进制为:,dec,xn;,cout,八进制为:,oct,x,endl,;,灵活的局部变量说明,C,和,C,的区别,C,中不允许将局部变量放在可执行代码之后,C,则允许局部变量声明可放在任何地方,例:,void fun(),int,i;,i=10;,for(,int,j=0;j25;j+),.,1.,在,C,中,,int,j,0,就是非法的,2.,在,C,中,,j,的有效范围是从变量的说明点到所在的最小分程序末的范围内有效,灵活的局部变量说明,变量说明地点的建议:在大函数中,在最靠近使用变量的位置说明变量较为合理;在较短的函数中,把局部变量集中在函数开始出说明较好。,例:,f(),int,i=10;,for(,int,j=0;j25;j+),.,OK!,NO!,判断下面程序中变量,j,的有效范围,?,结构、联合、枚举名可直接作为类型名,person s1,s2;,C,程序必须要这样写,C,程序可以这样写,struct,person,char name20;,int,age;,;,main(),struct,person s1,s2;,结构、联合、枚举名可直接作为类型名,枚举类型,枚举类型是用户自定义的数据类型,它为一组整型数值提供方便记忆的标识符。枚举类型定义的一般形式:,enum,;,例如:,enum,colorred,white,blue,;,声明枚举类型变量,(,C,声明如下):,enum,color,Mycolor,;,声明枚举类型变量,(,C+,声明如下):,color,Mycolor,;,程序举例,例,:,荷兰国旗问题:设有排成一排的个桶,每个桶里装有一块小石,每块小石为红、白、蓝三种颜色之一。要求将这些小石重新排列,使所有红的在前,白的居中,蓝的在后。重排时,对于每块小石的颜色只能查看(测试)一次,而且允许用两两交换的办法来调整小石的位置。由于红、白、蓝是荷兰国旗的颜色,因此该问题称为荷兰国旗问题。,解决方法:,设数组,bucket,为这些桶,用,0,、,1,、,2,分别代表红、白、蓝三种颜色,,bucket,中的每个元素为,0,、,1,、,2,三值之一。,开始时,这些小石是杂乱放置的,经过重排后的,bucket,的值应该如下图所示:,0 0 0 1 1 1 2 2 2,red red white white blue blue,为了实现这个目的,在重排的过程中,,bucket,的值得划分四个区:,red,区,white,区?,Blue,区,rp,next,bp,其中?表示此区中的元素待测试。,设置三个下标:,rp,指向红区最右的元素,,next,指向下一个要查看的元素,,bp,指向蓝区最左的元素。显然当,next=,bp,时,数组中的值已经全部排好。,设,rp,,,next,,,bp,的初值分别为,0,,,1,,,N,1,,,主要算法如下:,while next,bp,if(next,标记的是红色,),rp,下标移向待查的元素,将,next,与,rp,标记的元素交换,next,移向下一个元素,否则,if(next,标记的是白色,),白色小石不动,next,移向下一个元素,否则该元素是蓝色,bp,下标移向待查的元素,将,next,与,bp,标记的元素交换,程序例子,枚举程序例子,const,修饰符,让我们假设下面的情形可能就出现在你的程序中:,for (index=0;index512;+index),512,具有明显的可读性吗?(,NO,),你知道,512,代表什么含义吗?(,NO,),当这句话出现在,10000,行代码中占有,4,,如果想把,512,修改为,1024,,你认为任务艰巨吗?,int,bufSize,=512;,/.,for (index=0;index,bufSize;+index,),作如下改动,这样做还有任何问题吗?,const,修饰符,也许因为你的粗心,你的程序中出现了下面的语句:,解决这个问题的两个方法:,define,bufSize,512,const,int,bufSize,=512;,if(,bufSize,=1).,天哪!?这个错误多么严重!,这是一个宏定义指令,可以用在,C,和,C,中,这是一个定义变量的语句,只能在,C,中使用,const,将一个对象转换成一个常量,因为常量在定义之后就不能被修改,所以它必须在定义的时候被初始化,const,修饰符,const,可以与指针一起使用,但是它们的组合情况比较复杂,可以分一下三种:,(1),指向常量的指针是指一个指向常量的指针变量。,例如:,const char*name=“,zhang,”,;,表明:指针,name,本身可以改变;,而*,name,(即,name,所指的内容)是常量,不允许改变。,zhang,name,wang,name,允许:,name=“,wang,”,;,不允许:*,name=“s”,;,/,不允许改变指针所指的常量。,const,修饰符,(2),常指针,常指针是指把指针本身定义为常的,而不是它指向的对象声明为常量。,例如:,char*const name=“,zhang,”,;,表明:指针,name,本身是常量,不允许改变;,而*,name,(即,name,所指的内容)允许改变。,zhang,name,shang,name,不允许:,name=“,wang,”,;,允许:,name0=s,;,/,允许改变指针所指的常量。,注,:由于常指针所指的内容也是常的,所以,name,的内容也不允许改。,const,修饰符,(3,),指向常量的常指针是指这个指针本身不能改变,而它所指向的值也不能改变。即要声明一个指向常量的常指针。,例如:,const char*const name=“,zhang,”,;,/,指向指向常量的常指针。,表明:指针,name,本身是常量,不允许改变;,而,name,所指的内容也是常的,不允许改变。,不允许:,name=“,wang,”,;,不允许:,name0=s,;,/,允许改变指针所指的常量。,const,和,define,的区别,define,只是使用了“符号替代”这样一个简单的思路,它不能代表任何别的意义,const,定义的常量是有类型意义的,const,定义的常量可以让,C,的编译程序方便地检查类型信息的错误,const,的作用与,define,定义常量的作用相似,但是,const,取代不了,define,所提供的功能,const,是真正的常量,而,define,则不是常量,是符号替换,参看样例程序,2_3,运行程序,const,和,define,的区别,程序中的,D1,和,D2,分别如下形式替换:,程序中的,C1,和,C2,分别代表初始赋的值,2,和,0,cout,D1 is:D1 tD2 is:D2,endl,;,(aa),D1D1,(aa)(aa),const,和指针,const,用来修饰指针变量所指向的内容,const,用来修饰指针变量自身,const,对上述两方面内容同时修饰,const,的用途,const,int,*p;,const,int,var,=5;,p=&,var,;,var,=6;,*p=7;,int,mem,;,p=&,mem,;,mem,=10;,*p=*p+1;,const,int,*p;,const,用来修饰指针变量所指向的内容,形式:,const,int,*p;,效果:,const,冻结了指针变量,p,所指向的内容,即不能通过指针变量来修改所指向的内容,p,5,var,mem,const,int,var,=5;,p=&,var,;,var,=6;,*p=7;,int,mem,;,p=&,mem,;,mem,=10;,*p=*p+1,10,const,用来修饰指针变量自身,形式:,效果:,const,冻结了指针变量自身,即指针变量不能再指向别的变量,通过*,p,更改变量,var,的值是可能的,即*,p=6,是合法的,请想一想下面的定义正确吗?,int,var,;,int,*const p=&,var,;,p,5,var,const,int,var,=5;,int,*const p=&,var,;,*,p=6,的合法性与,var,=6,的非法性的矛盾产生了二义性,const,对上述两方面内容同时修饰,形式:,效果:,const,冻结了指针变量,p,且使指针变量,p,不能修改所指向的内容,下面的对,p,的使用都是非法的:,*,p=6;,p=,int,var,;,const,int,*const p=&,var,;,const,int,var,=5;,const,int,*const p=&,var,;,const,的用途,定义类型化的常量,修饰函数参数,用于保证实参在该函数内部不被改动,例:,void display(const,int,*s,int,n),for(,int,i=0;in;i+),cout,(*s+)+;,编译将不能通过,因为试图修改指针,s,所指向的内容,将是不允许的。,内置函数,考虑下面,min(),函数:,为这样的小操作定义一个函数的好处是:,如果一段代码包含,min(),的调用,那么阅读这样的代码并解释它的含义比读一个条件操作符的实例要容易的多,改变一个局部化的实现要比更换一个应用中的,300,个出现要容易得多,函数可以被重用,不必为其他的应用重写代码,int,min(,int,v1,int v2),return(v1v2?v1:v2);,(v1=v2|v1v2),内置函数,这样做有缺点吗?,一个严重的缺点:调用函数比直接计算条件操作符要慢的多,必须要拷贝两个实参,保存机器的寄存器,程序还必须转向一个新位置,有解决方案吗?,使用,define,使用,inline,(,内联)函数,#define min(v1,v2)(v1v2?v1:v2),inline,int,min(,int,v1,int v2),return(v1v2?v1:v2);,这样写安全吗?,消除了,define,的不安全因素,内置函数,内置函数的执行原理,当一个函数被指定为,inline,函数,则它将在程序中每个调用点上被“内联的”展开。,inline,指示对编译器来说只是一个建议,一个定义的内联递归函数将不被展开,一个,1200,行的函数也不太可能被展开,int,minVal12=min(n,m);,int,minVal12=nm?n:m;,内置函数,inline,的使用策略,优化小的、只有几行的、经常被调用的函数,使用,inline,的注意事项,内置函数的定义必须出现在内置函数第一次被调用之前,函数原型,函数原型由函数返回类型、函数名以及参数表构成,函数原型描述的是函数的接口,函数原型的定义形式:,函数原型的作用:使编译器检查一个函数调用表达式中可能存在的问题,类型 函数名(参数类型说明列表);,函数原型,有如下的函数声明语句:,int,sum(,int,int,),sum(“hello”,”world”);,sum(1234),sum(3.14,6.29),sum(3,6),调用,error:invalid argument types(const char*,const char*)expecting(,int,int,),error:missing value for second argument,argument:conversion from const double to,int,possible loss of data,函数原型,关于“返回类型”的说明,函数原型中不写的,,C,默认为,int,型,函数没有返回值时,则返回类型处一定要写为,void,而不能不写,int,sum(,int,int,),sum(,int,int,),函数原型,关于“参数”的说明,可以没有参数名,而只需要有类型名,参数名无所谓,只取决于类型名和个数,参数列表为空时,,C,假定该函数的参数表为空(,void,),int,sum(,int,int,),int,sum(,int,a,int,b),int,sum(,int,a,int,b),int,sum(,int,c,int,d),在,C,中,在,C,中,f(),f(void),f(),f(void),想通过参数名的不同来区分两个函数是行不通的,在,C,中,,f(void),表示无参数;,f,(),表示可能有多个参数;为什么会这样?请大家在学完函数重载后再想一想原因。,函数原型,函数说明和函数定义的区别,函数说明是用来在调用函数之前的一个说明性语句,可以在程序中出现多次,函数定义指定函数的操作系列,int,sum(,int,int,);,int,sum(,int,a,int,b),return a+b;,区别一,区别二,函数说明语句,函数定义,带有缺省参数的函数,在函数说明或函数定义中为形参指定一个缺省值,调用这样的函数时,如果指定了形参相对应的实参,则形参使用实参的值,如果未指定相应的实参,则形参使用缺省值,参看样例,运行程序,带有缺省参数的函数,缺省参数:在函数定义或函数声明中指定了初始值的参数称为缺省参数,初始值可定义为任意的初始化表达式,可以包含函数调用以及全局变量等,缺省参数必须从右向左定义,并且在一个缺省参数的右边不能有未指定的缺省值的参数,int,fun(,int,w=,sqrt(a,),int,x=a*a);,void fun(,int,w,int,x=1,int y=1,int z=1);,void fun(,int,w,int,x=1,int,y,int,z=1);,在,x,缺省参数的右边,有未指定的缺省值的参数,y,该定义形式完全正确,带有缺省参数的函数,调用要求,在函数调用时,若某个参数省略,则其后的参数皆应省略,void fun(,int,w,int,x=1,int y=1,int z=1);,fun(2);,fun(2,2);,fun(2,2,3);,fun(2,2,3,2);,fun(2,3,2);,正确的调用方式,错误的调用,带有缺省参数的函数,使用函数说明语句可以 为缺省参数提供作用域,运行程序,void,fun(int,int,=0);,void,anFun,(),void,fun(int,int,=1);,fun(1);,void,anotherFun,(),fun(1);,int,main(int,argc,char*,argv,),anFun,();,anotherFun,();,return 0;,void,fun(int,x,int,y),cout,y,endl,;,全局函数说明,在,anFun,函数中的局部函数说明,使用局部函数说明,调用等价于,fun(1,1),使用全局函数说明,调用等价于,fun,(,1,,,0,),带有缺省参数的函数,当函数说明和函数定义不在同一个作用域中时,其默认值可以不相同,否则就只能在一处定义默认值,void,fun(int,x,int,y=0);,void,fun(int,x,int,y=1);,因为在同一个作用域内,所以不能在函数说明和函数定义中给一个参数定义不同的缺省参数,void,fun(int,x,int,y=0);,void,fun(int,x,int,y=1);,因为不在同一个作用域内,所以在函数说明和函数定义中可以给一个参数定义不同的缺省参数,函数重载,假设我们定义一个函数,它返回参数中的最大值。,当我们面临不同于,int,类型的参数时,我们只能这样做:,繁杂的函数名使我们头大,能否有办法解决这样的问题,使得相同的一般性动作的函数具有相同的函数名,int,max(int,int,),int,vi_max(const vector&),int,matrix_max(const matrix&),函数重载,上面的情形可以成为如下形式:,在,C,中使用函数重载的目的是:使功能类似的函数使用相同的名字,令程序员很快可以掌握这些函数的用法,int,max(int,int,),int,max(const vector&),int,max(const matrix&),C,中使用重载的机制,C,编译器利用定义的函数的参数类型不同,或者参数的个数来区别调用的函数,C,编译器不能使用函数的返回类型来区别调用的函数,int,max(int,int,),int,max(const vector&),int,max(const matrix&),long,int,abs(int,),float,abs(int,),C,使用重载的机制,请判断下列函数是否具有重载的特性,void print(const string&,str,);,void print(const string,unsigned,int,max(,int,i1,int i2);,int,max(,int,int,);,int,max(,int,*,ia,int,sz,);,int,max(,int,*,int,=10);,两个函数的返回类型和参数表精确匹配,则第二个声明被视为第一个的重复声明,两个函数参数表相同,但是返回类型不同,则第二个声明被视为第一个的错误重复声明,会标记为编译错误,两个函数的参数表中,只有缺省实参不同,则第二个声明被视为第一个的重复声明,重载函数与缺省参数的函数的关系,对于具有多个缺省参数的函数,编译器将把它们视作具有不同参数的几个函数,参数个数依次增加,缺省参数将会产生“缺省参数个数,1”,个重载函数,这样会产生问题吗?,void fun(,int,a,int,b=5,int c=10),void fun(,int,a),void fun(,int,a,int,b),void fun(,int,a,int,b,int,c),编译器将其视作三个函数对待,即相当于,fun,函数进行了重载,重载函数与缺省参数的函数的关系,程序的运行结果是什么?,程序没有运行结果,因为编译就不能通过,#include,void,mul,(,int,x,int,y),cout,x*y“2 parameters”,endl,;,void,mul,(,int,x,int,y,int,z),cout,x*y*z“3,prarameters,”,endl,;,void,mul,(,int,x,int,y=3,int,z=4);,void main(),mul,(2,3);,mul,(2,3,4);,因为在全局作用域中有缺省参数函数的声明,所以导致,mul(2,3),的调用产生了二义性,mul,(2,3),重载函数和函数说明作用域的关系,程序的运行结果?,#include,void,abs(int,);,void main(),void abs(float);,abs(5);,void,abs(int,i),cout,0?i:-i),abs(int,),endl,;,void abs(float f),cout,0?f:-f)abs(float),endl,;,5 abs(float),作用域运算符“:”,通过使用作用域运算符“:”可以在局部作用域中存取被隐藏的全局作用域中的名字,通常,若有两个同名变量,avar,,,一个是全局的,一个是局部的,则局部变量在其作用域内具有较高的优先权。如果希望在局部变量的作用域内使用同名的全局变量,可在该变量前加上“,:”,此时,:,avar,代表全局变量,avar,“:”,为作用域运算符,参看下页的程序,作用域运算符“:”,程序的运行结果,#include,int,avar,;,main(),int,avar,;,avar,=25;/,局部变量,avar,:,avar,=10;/,全局变量,avar,cout,“local,avar,=“,avar,endl,;,cout,“global,avar,=“:,avar,”,endl,;,return 0;,local,avar,=25,global,avar,=10,无名联合,无名联合是,c+,中的特殊联合,它可使一组数据共享同一内存地址。如:,union,int,i;,float f;,在此无名联合中,声明了变量,i,和,f,具有相同的存储地址,无名联合通过使用其中数据项名字直接存取,i,20,;,强制类型转换,C,强制类型转换的概念同,C,C,中的强制类型转换的形式如下:,C,中不仅可以使用,C,中的转换形式,还可以使用如下的新形式:,int,i=10;,float x=(float)i;,int,i=10;,float x=float(i);,new和delete,回顾一下在,C,中,我们是按如下方式动态的申请和释放空闲空间:,在,C,中,我们既可以使用如上的方式,也可以使用该语言自身提供的,new,和,delete,操作符:,int,*p;,p=(,int,*),malloc(sizeof(int,);,free(p);,int,*p;,p=new,int,;,delete p;,new,能够自动返回正确的指针类型,不必对返回指针进行类型转换,new,可以自动计算要分配内存的类型的大小,而不必使用,sizeof,(),来计算所要的字节数,这就减少了发生错误的可能性,用,new,可以将分配的对象初始化,new,和,delete,都可以被重载,允许建立自定义的分配系统,new和delete,使用方法,用,new,申请空间的格式:,p,new type;,用,delete,释放所申请的空间的格式:,delete p;,type,为类型名,可以是基本的类型,也可以是用户定义的复杂的类型,包括类,p,为指向该数据类型,type,的指针,其中保存着,new,分配的内存首地址,new和delete,new,的特殊用法,用,new,分配内存的同时,可以用,(),指定其初始值,但不能为数组元素指定初值,用,new,也可以建立数组类型的变量,p=new type,size,;,p=new float5;,p=new,intm,;,p=new doublem+5*n;,int,*p;,p=new int(5);,整型表达式,具体的数值,变量,有运算符的表达式,new和delete,用,new,建立多维数组类型的变量,p=new typesizemns;,例:,int,(*pi)34=new,int,i*434;,参看样例,(,动态分配数组,),运行程序,p,应被说明为:,type(*p)mns;,其中,m,n,s,必须是整常数,,size,是个整型表达式,new,和,delete,的注意事项,需要判断,new,所分配的内存是否有效(当无效时,new,返回一个,0,值),new,和,delete,应该配对使用,及时释放内存是程序员的责任,new,分配的内存地址不能被改变,因为这个地址将用于,delete,运算符正确释放被申请的这块内存;否则,会引起系统的混乱,new,和,delete,的注意事项,int,*pi=new int3;,pi=pi+2;,/,delete pi;,pi,pi,红色的这三个分配单元就是被释的空间,这显然是不对的,完全会引起系统的混乱,int,*pi=new int3;,pi=pi+2;,/,delete pi;,int,*temp=pi;,temp,delete temp;,这样就保证了释放空间的安全性,请记住!,请记住!,引用,引用是给某一个常量,变量,数组或对象起了一个别名,.,对引用的任何操作,都是对被引用的目标的操作,.,类型,&,引用名,=,被引用的目标的名字,;,类型指的是被引用的目标的类型,.,引用必须在声明时就初始化,没有初始化的引用是毫无意义的,一旦初始化就与被引用的目标维系在一起,.,对引用的赋值是对引用所维系的目标的赋值,引用就是被引用的目标的别名,引用不占据内存,和被引用的目标共同占有,#include,main(),int,num=50;,int,int,*pointer=,cout,“ref,的地址为”,&ref,endl,;,cout,“num,的地址为”,&num,endl,;,cout,“p,的地址为”,&pointer,endl,;,ref=ref+10;,cout,“num=“num,endl,;,num=num+40;,cout,“ref=“ref,endl,;,*pointer=*pointer+10;,cout,“*pointer=”*pointer,endl,;,引用,int,num=50;,cout,“*pointer=“*pointer,endl,;,*pointer=*pointer+10;,cout,“ref=“ref,endl,;,num=num+40;,cout,“num=“num,endl,;,int,*pointer=,cout,“ref,的地址为”,&ref,endl,;,cout,“num,的地址为”,&num,endl,;,cout,“p,的地址为”,&pointer,endl,;,ref=ref+10;,int,50,num,num(ref),&num,pointer,60,100,110,引用不占用内存,指针变量要有自己内存空间,运行这个程序,引用的注意事项,如果引用不是用作函数的参数或返回值,则在说明时必须进行初始化,由于引用不是变量,不能说明引用的引用(联系指针的指针的概念),不能说明元素类型为引用数组,不能说明指向引用的指针,int,i;,int,j=i;,int,i;,int,int,int,int,引用的注意事项,引用的类型可以是指针,引用不可重新赋值,int,*a;,int,*,int,i,k;,int,j=,引用的初始值,将引用分为两类,用,const,修饰的引用称为常引用,没有,const,修饰的引用称为一般引用,一般引用,为其提供初始值的形式为:,同类型的变量,同类型的引用,不同类型的引用和变量将出现编译错误,int,num=50;,int,int,ref2=100;,double num=50;,int,error:initializing:can not convert from double to,int,&,在,VC,6.0,中的问题,常引用,为其提供初始值的形式有:,同类型变量,同类型的常量,不同类型的变量和常量,const,int,const,int,temp=20;,const,int,temp,是系统用来存放,20,而生成的临时变量,double,ss,=20.2;,const,int,&ref=,ss,;,编译时将出现如下的警告信息:,“,warning”:initializing:conversion from double to const,int,possible,loss of data,引用参数,通过引用参数产生的效果同按地址传递是一样的,但其语法更清楚,#include,void,swap(int,*a,int,*b),int,temp=*a;,*a=*b;,*b=temp;,main(),int,a=5,b=10;,swap(,cout,atb,endl,;,#include,void,swap(int,&a,int,&b),int,temp=a;,a=b;,b=temp;,main(),int,a=5,b=10;,swap(a,b);,cout,atb,endl,;,返回引用的函数,形式:定义函数的返回类型为引用,例:,int,&,max(int,int,);,目的:为了能够将该函数用在赋值运算符的左边,参看样例,运行程序,总结,回顾所学的内容,有问题吗?,作业:,2.7,、,2.8,、,2.9,weerebgyhybn,weerebgyhybn,weerebgyhybn,面向对象技术,面向对象技术,C,语言概述,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服