欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    (精品)C++面向对象程序设计教学PPT2.ppt

    • 资源ID:85523339       资源大小:884.01KB        全文页数:107页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    (精品)C++面向对象程序设计教学PPT2.ppt

    第第2章章C+基基础础本章主要介绍本章主要介绍C+对对C语言的某些改变和扩展,语言的某些改变和扩展,是面向对象方面的特征,包括:是面向对象方面的特征,包括:C+的数据类型的数据类型 类型转换类型转换 const常量、引用、指针及函数参数常量、引用、指针及函数参数 函数原型、默认参数、函数重载函数原型、默认参数、函数重载 内联函数内联函数 名字空间及其应用名字空间及其应用 变量作用域和生存期变量作用域和生存期 数据输入数据输入/输出输出2.1C+对对C语言数据类型的扩展语言数据类型的扩展1、C数据类型在数据类型在C+中继续可用中继续可用2、C+对对C的结构、枚举、联合进行了扩展的结构、枚举、联合进行了扩展C:结构名不是类型结构名不是类型structsome_struct;structsome_structstruct_var;typedefstructsome_structstruct_type;C:结构名、联合名为类型结构名、联合名为类型structstruct_name;struct_tstruct_var;unionenum2.2局部变量说明局部变量说明C局部变量的定义局部变量的定义在语句块内可执行语句之前在语句块内可执行语句之前C局部变量的定义局部变量的定义可在语句块内任何语句可以出现的地方可在语句块内任何语句可以出现的地方但不能被但不能被goto及类似语句跳过及类似语句跳过好处好处方便:使用时才定义方便:使用时才定义易读:类型信息就近获取易读:类型信息就近获取2.3const常量常量1、常量定义、常量定义C#define 常量名称常量名称 常量常量Cconst 类型类型 常量名称常量名称=常量常量;常量在定义常量在定义时就必须初时就必须初始化始化2.3const常量常量1、常量定义、常量定义C#define 常量名称常量名称 常量常量Cconst 类型类型 常量名称常量名称=常量常量;2.3const常量常量2、常量说明、常量说明常量一经定义就不能修改,例如:常量一经定义就不能修改,例如:constinti=5;/定义常量定义常量ii=10;/错误,修改常量错误,修改常量i+;/错误,修改常量错误,修改常量const常量必须在定义时初始化,例如:常量必须在定义时初始化,例如:constintn;/错误,常量错误,常量n未被初始化未被初始化在在C+中,表达式可以出现在常量定义语句中。如中,表达式可以出现在常量定义语句中。如果定义的常量是整型,则类型关键字果定义的常量是整型,则类型关键字int可以省略。可以省略。intj,k=9;/L1consti1=10+k+6;/L2constinti1=10+k+6;/L31、C+内存分配内存分配静态分配(静态变量)静态分配(静态变量)编译器在处理源代码时为变量分配内存,其效率较高,但编译器在处理源代码时为变量分配内存,其效率较高,但缺少灵活性(要求程序执行之前就知道变量所需的内存类缺少灵活性(要求程序执行之前就知道变量所需的内存类型和数量)型和数量)动态分配(动态变量)动态分配(动态变量)程序执行时调用运行时刻库函数来分配变量的内存。程序执行时调用运行时刻库函数来分配变量的内存。两者的区别两者的区别静态变量是有名字的变量,可以通过名字对它所代表的内静态变量是有名字的变量,可以通过名字对它所代表的内存进行操作;动态变量是没有名字的内存变量,只能通过存进行操作;动态变量是没有名字的内存变量,只能通过指针进行操作。指针进行操作。静态变量的分配和释放由编译器自动处理,动态变量的分静态变量的分配和释放由编译器自动处理,动态变量的分配与释放必须由程序员控制。配与释放必须由程序员控制。2.4指针指针本节主要介绍本节主要介绍C+的指针及的指针及C+动态内存分配运算符和动态内存分配运算符和回收运算符回收运算符new、delete指针与常量指针与常量之间的关系,及之间的关系,及0指针指针和和void指针指针2.4指针指针1、C+内存分配内存分配静态分配(静态变量)静态分配(静态变量)编译器在处理源代码时为变量分配内存,其效率较高,但编译器在处理源代码时为变量分配内存,其效率较高,但缺少灵活性(要求程序执行之前就知道变量所需的内存类缺少灵活性(要求程序执行之前就知道变量所需的内存类型和数量)型和数量)动态分配(动态变量)动态分配(动态变量)程序执行时调用运行时刻库函数来分配变量的内存。程序执行时调用运行时刻库函数来分配变量的内存。两者的区别两者的区别静态变量是有名字的变量,可以通过名字对它所代表的内静态变量是有名字的变量,可以通过名字对它所代表的内存进行操作;动态变量是没有名字的内存变量,只能通过存进行操作;动态变量是没有名字的内存变量,只能通过指针进行操作。指针进行操作。静态变量的分配和释放由编译器自动处理,动态变量的分静态变量的分配和释放由编译器自动处理,动态变量的分配与释放必须由程序员控制。配与释放必须由程序员控制。2.4.1指针指针概念的回顾概念的回顾2、动态内存分配、动态内存分配-指针指针对类型对类型T,T*是是“到到T的指针的指针”,即一个类,即一个类型为型为T*的变量,能存一个类型的变量,能存一个类型T的对象的地的对象的地址址charc;c=a;charp*p=&c;2.4.1指针指针概念的回顾概念的回顾pc?a?&c*P内存指针是一个复杂的概念,它能够指向(保存)指针是一个复杂的概念,它能够指向(保存)不同类型变量的内存地址。例如:不同类型变量的内存地址。例如:int*pi;/pi是指向是指向int的指针的指针int*pc;/pc是指向是指向int指针的指针指针的指针int*pA10;/pA是指向是指向int的指针数组的指针数组int(*f)(int,char);/f是指向具有两个参数的函数的指针是指向具有两个参数的函数的指针int*f(int)/f是一个函数,返回一个指向是一个函数,返回一个指向int的指针的指针2.4.1指针指针概念的回顾概念的回顾0指针指针0是一个整数,在是一个整数,在C语言和语言和C+中可以把它转换成为中可以把它转换成为任意数据类型,如整型、浮点型、指针等。可以把任意数据类型,如整型、浮点型、指针等。可以把0赋值给不同类型的变量。赋值给不同类型的变量。没有任何变量会被分配到地址没有任何变量会被分配到地址0,所以,所以0就可以作为就可以作为一个指针常量,表明指针当时没有指向任何变量。一个指针常量,表明指针当时没有指向任何变量。比如,对于前面的指针定义,以下赋值是正确的:比如,对于前面的指针定义,以下赋值是正确的:pc=0;pA=0;f=0;0与与NULL2.4.2指针指针与与02.4.3指针与指针与const1、指针与、指针与const的限定关系的限定关系pp?a?&cInt const*p=&cP为常量,即此内存的值不能修改const char*p=&c*P为常量,即此内存的值不能修改2、限制变量、参数的访问,避免非本意的数据修改避免非本意的数据修改举例#includemain()inti,j;constintic=100;constint*ip=⁣int*consticp=&i;/icp=&j;/err*icp=200;couti=iendl;coutj=jendl;cout*ip=*ipendl;cout*icp=*icpendl;icpicp是一个常是一个常量地址量地址,此处此处企图修改它企图修改它2.4.3指针与指针与const3、指向常量的指针、指向常量的指针在指针定义前加在指针定义前加const,表示指向的对象是常量。表示指向的对象是常量。constinta=78;constintb=28;intc=18;constint*pi=&a;/定义指向常量的指针定义指向常量的指针*pi=58;/error,不能修改指针指向的常量不能修改指针指向的常量pi=&b;/ok,指针值可以修改指针值可以修改*pi=68;/errorpi=&c;/ok*pi=88;/errorC=98;/ok*p p是常量,但通过是常量,但通过修改的值而使修改的值而使*p p发生了变化,这种发生了变化,这种用法就有问题了,用法就有问题了,2.4.3指针指针与与const例题例题:限制函数修改参数限制函数修改参数/eg.cpp#includevoidmystrcpy(char*Dest,constchar*Src)while(*Dest+=*Src+);voidmain()chara20=Howareyou!;charb20;mystrcpy(b,a);coutbendl;2.4.3指针指针与与const4、指针常量、指针常量在指针定义语句的指针名前加在指针定义语句的指针名前加const,表示指针本身是表示指针本身是常量。例如:常量。例如:char*constpc=“aaaa”;/定义指针常量定义指针常量,在定义时必须初始化,在定义时必须初始化pc=“bbbb”;/error,指针常量不能改变其指针值指针常量不能改变其指针值*pc=“a/err,所指的内容可改所指的内容可改*pc=a;/ok*(pc+1)=b;/ok,pc+=y;/errorconstintb=28;int*constpi=&b;/error,pi不能变不能变,但它所指的内存单却但它所指的内存单却可以改变可以改变,此处却将它指向了一个不可变的内存单元此处却将它指向了一个不可变的内存单元,即即:/不能将不能将constin*转换成转换成int*2.4.3指针指针与与const5、指向常量的常指针、指向常量的常指针可以定义一个指向常量的常指针变量,它必须在定义时进行初始化。例如:constintci=7;intai=8;constint*constcpc=&ci;/指向常量的指针常量指向常量的指针常量constint*constcpi=&ai;/okcpi=&ai;/error,指针不能修改指针不能修改*cpi=39;/error,不能修改所指对象不能修改所指对象ai=39;/ok,2.4.3指针指针与与const6、const、指针与变量赋值、指针与变量赋值一般编译器不能跟踪指针在程序中任意一般编译器不能跟踪指针在程序中任意一点所指向的对象一点所指向的对象,任何一个任何一个“企图将企图将一个非一个非const对象的指针指向一个常量对象的指针指向一个常量对象对象”的动作都将引起编译错误。的动作都将引起编译错误。constdoubleminWage=9.60;double*ptr=&minWage;2.4.3指针指针与与constconst对象的地址只能赋值给指向对象的地址只能赋值给指向const对象的对象的指针,但是指向指针,但是指向const对象的指针却可以被赋对象的指针却可以被赋于一个非于一个非const对象的地址。对象的地址。constdoubleminWage=9.60;constdouble*ptr=&minWage;doubledval=3.14;ptr=&dval;*ptr=23;dval=23;2.4.3指针指针与与const2.4.3指针指针与与const练习练习1、下面的声明中,哪些是错误的?、下面的声明中,哪些是错误的?inti;constintic;constint*pic;int*constcpi;constint*constcpic;未初始未初始化化2.4.3指针指针与与const练习练习2、指出下面的错误、指出下面的错误1.inti=-1;2.constintic=i;3.constint*pic=⁣4.int*constcpi=⁣5.constint*constcpic=⁣6.i=ic;7.pic=⁣8.cpi=pic;9.pic=cpic;10.cpic=⁣11.ic=*cpic;错误错误2.4.4void指针指针1、指针与地址、指针与地址每个每个指针指针都都是是一个一个内存地址内存地址,但都,但都有有一个相关的一个相关的类型类型指示编译器指示编译器怎样解释它所指定内存区域的内容,以及该内存区域应该怎样解释它所指定内存区域的内容,以及该内存区域应该跨越多少个内存单元。跨越多少个内存单元。相同类型相同类型的指针进行的指针进行比较比较或或相互赋相互赋值值才有意义。才有意义。2、void*指针指针void*指针只表示与它相关的值是个地址,但该地址的数据指针只表示与它相关的值是个地址,但该地址的数据类型是未知的。它是能够接受任何数据类型的特殊指针。类型是未知的。它是能够接受任何数据类型的特殊指针。void*最重要的用途是作为函数的参数,向函数传递一个类最重要的用途是作为函数的参数,向函数传递一个类型可变的对象。另一种用途就是从函数返回一个无类型的型可变的对象。另一种用途就是从函数返回一个无类型的对象,在使用时再将它显式转换成适当的类型。对象,在使用时再将它显式转换成适当的类型。1、动态存储管理的概念、动态存储管理的概念系统为每个程序提供了一个在程序执行时可用系统为每个程序提供了一个在程序执行时可用的内存空间,这个内存空间被称为的内存空间,这个内存空间被称为空闲存储区空闲存储区或或堆堆(heap),运行时刻的内存分配就称为),运行时刻的内存分配就称为动动态内存分配态内存分配。2、在、在C语言中,动态内存分配用语言中,动态内存分配用mallc和和free函数函数完成完成int*ip=(int*)malloc(sizeof(int)*100);free(ip);2.4.5new和和delete3、C动态内存分可由动态内存分可由new,delete运算符完成运算符完成New用于从内存中分配指定大小的内存用于从内存中分配指定大小的内存用法用法1:p=newtype;用法用法2:p=newtype(x);用法用法3:p=newtypen;delete用于释放用于释放new分配的堆内存分配的堆内存用法用法1:deletep;用法用法2:deletep;2.4.5new和和delete2.4.5new和和delete4、【例例2-4】用用new和和delete分配与释放堆内存。分配与释放堆内存。/Eg2-4.cpp#includevoidmain()int*p1,*p2,*p3;p1=newint;/分配一个能够存放分配一个能够存放int类型数据的内存区域类型数据的内存区域p2=newint(10);/分配一个分配一个int类型大小的内存区域,并将类型大小的内存区域,并将10存入其中存入其中p3=newint10;/分配能够存放分配能够存放10个整数的数组区域个整数的数组区域*p1=5;*p3=1;p31=2;/访问指向数组的数组元素访问指向数组的数组元素p32=3;coutp1address:p1value:*p1endl;coutp2address:p2value:*p2endl;coutp30address:p3value:*p3endl;coutp31address:&p31value:p31endl;deletep1;/释放释放p1指向的内存指向的内存deletep2;deletep3;/错误,只释放了错误,只释放了p3指向数组的第指向数组的第1个元素个元素deletep3;/释放释放p3指向的数组指向的数组2.4.5new和和delete5、new、delete和和malloc、free的区别的区别new能够自动计算要分配的内存类型的大小,能够自动计算要分配的内存类型的大小,不必用不必用sizeof计算所要分配的内存字节数计算所要分配的内存字节数new不需要进行类型转换,它能够自动返回不需要进行类型转换,它能够自动返回正确的指针类型。正确的指针类型。new可以对分配的内存进行初始化。可以对分配的内存进行初始化。new和和delete可以被重载,程序员可以借此扩可以被重载,程序员可以借此扩展展new和和delete的功能,建立自定义的存储分的功能,建立自定义的存储分配系统。配系统。sizeof()被改为被改为sizeof2.5引用(引用(Reference)1、概念、概念“引用引用”即即“别名别名”,即是某对象的另一个名字,即是某对象的另一个名字,引用的主要用途是为了描述函数的参数和返回值。引用的主要用途是为了描述函数的参数和返回值。特别是用于运算符的重载。特别是用于运算符的重载。定义引用:定义引用:类型类型&引用名引用名=变量名变量名;例如:例如:inti=9;/L1int&ir=i;/L2ir与与i是同一实体的不同名称是同一实体的不同名称与指针区别与指针区别int*ip=&i;int&ir=i;2.5引用(引用(Reference)2、【例例2-5】引用的简单例子。引用的简单例子。/Eg2-5.cpp#includevoidmain()inti=9;int&ir=i;couti=iir=irendl;ir=20;couti=iir=irendl;i=12;couti=iir=irendl;couti的地址是:的地址是:&iendl;coutir的地址是:的地址是:&irendl;3、使用引用应该注意的事情、使用引用应该注意的事情引用不是值,不占用存储空间引用不是值,不占用存储空间引用在声明时必须初始化,否则会产生编译错误引用在声明时必须初始化,否则会产生编译错误引用的初始值可以是一个变量或另一个引用引用的初始值可以是一个变量或另一个引用引用可以视为引用可以视为“隐式指针隐式指针”,但不分配存储空间,但不分配存储空间引用由引用由类型标准符和一个取地址操作符来定义类型标准符和一个取地址操作符来定义,必须被初始,必须被初始化,且不可重新赋值化,且不可重新赋值inti,k;int&r=i;r=&k/errorr=k;/ok引用的地址就是其所引用的变量的地址引用的地址就是其所引用的变量的地址intnum=50;int&rnum=num;int*p=#/p是指向是指向num的指针,非引用;的指针,非引用;int*rp=rnum;/err,当为,当为int*rp=&rnum;2.5引用(引用(Reference)若一个变量声明为若一个变量声明为T&,必须用一个必须用一个T类型的变量或类型的变量或对象,或能够转换为对象,或能够转换为T类型的对象进行初始化类型的对象进行初始化double&rr=1;可以有指针变量的引用,不能有指向引用的指针可以有指针变量的引用,不能有指向引用的指针int&a=1;int*p;int*&rp=p;/okrp是一个引用,它引用的是指针是一个引用,它引用的是指针int&*ra=a;/error,ra是一个指针,指向一个引用。是一个指针,指向一个引用。不能建立引用数组,可以建立数组元素的引用不能建立引用数组,可以建立数组元素的引用inta10;int&ra10=a;/errorInt&ra=a8;/ok引用的引用不存在,因为引用的引用不存在,因为T&不是类型不是类型int&a=1;int&ra=a;/error2.5引用引用(Reference)4、练习:练习:指出下列中的错误指出下列中的错误intival=1.01;int&rval1=1.01;int&rval2=ival;int&rval3=&ival;int*pi=&ival;int&rval4=pi;int&rval5=*pi;int&*prval1=pi;constint&ival2=1;constint&*prval2=&ival;错错误误2.5引用引用(Reference)5、引用与、引用与const#includevoidmain()inti=10;constdouble&x=23+23+i;coutx=xendl;对于形如对于形如T&xT&x的普通引的普通引用,必须用一个类型用,必须用一个类型T T的的左值初始化左值初始化x x。对于一个形如对于一个形如const const T&xT&x的初始化,则不必是一的初始化,则不必是一个左值,甚至可以不是个左值,甚至可以不是T T类型的,其处理过程度类型的,其处理过程度如下:如下:1 1、首先,如果需要,将、首先,如果需要,将应用应用T T的类型转换。的类型转换。2 2、而后将结果存入一个、而后将结果存入一个类型类型T T的临时变量。的临时变量。3 3、最后将此临时变量用、最后将此临时变量用作初始式的值。作初始式的值。56临时临时内存内存56.0056.00 x转换成double类型将将X X作为此作为此临时内存的临时内存的别名,直到别名,直到X“X“死亡死亡”2.5引用引用(Reference)doubledval=1024;constint&ri=dval;dval=90;coutdval=dvalendl;coutri=riendl;ri=90;/错误,修改常量程序输出结果:dval=90ri=1024whyriis1024?编译器将此定义转换编译器将此定义转换编译器将此定义转换编译器将此定义转换成类似如下的代码:成类似如下的代码:成类似如下的代码:成类似如下的代码:int temp=int temp=int temp=int temp=dvaldvaldvaldval;const int const int const int const int&ri ri ri ri=temp;=temp;=temp;=temp;对对对对dvaldvaldvaldval的修改不会影的修改不会影的修改不会影的修改不会影响到响到响到响到temptemptemptemp,所以,所以,所以,所以ri ri ri ri的的的的值不会因值不会因值不会因值不会因dvaldvaldvaldval而变动。而变动。而变动。而变动。2.5引用引用(Reference)5、引用与、引用与const2.6类型转换类型转换类型转换的概念类型转换的概念类型转换就是将一种数据类型转换为另一种数据类型转换就是将一种数据类型转换为另一种数据类型。类型。下面的例子说明类型转换的过程下面的例子说明类型转换的过程intival=0;ival=3.54+3;编译器的处理过程(编译器的处理过程(:编译器将给出警告):编译器将给出警告)1.为防止精度损失,将为防止精度损失,将int3提升为提升为double3.00;2.执行执行3.54+3.00结果为结果为6.54;3.将将=右边的类型转换为右边的类型转换为=左边的类型,直接切除小数左边的类型,直接切除小数右边的部份右边的部份,即即6.54变成了变成了64.将将6赋给赋给ival;1、隐式类型转换的概念、隐式类型转换的概念C+定义了一套标准数据类型转换的规则,在必要定义了一套标准数据类型转换的规则,在必要时,时,C+会用这套转换规则在程序员不参与进行会用这套转换规则在程序员不参与进行数据类型的自动转换。数据类型的自动转换。2、四种常见的隐式类型转换、四种常见的隐式类型转换在混合类型的算术表达式中,在混合类型的算术表达式中,最宽最宽的数据类型成为的数据类型成为目标类型目标类型,如图示。,如图示。2.6.1隐式隐式类型转换类型转换用一种类型的表达式赋予另一种类型的用一种类型的表达式赋予另一种类型的对象,对象,目标类型是被赋值的类型对象目标类型是被赋值的类型对象。把一个表达式传给一个函数调用,表达把一个表达式传给一个函数调用,表达式的类型与形参的类型不同,式的类型与形参的类型不同,目标类型目标类型是形式参数的类型是形式参数的类型;从一个函数返回一个类型,表达式的类从一个函数返回一个类型,表达式的类型与返回类型不符,型与返回类型不符,目标类型是返回类目标类型是返回类型。型。2.6.1隐式隐式类型转换类型转换1、显式类型转换、显式类型转换显示类型转换也称强制类型转换(显示类型转换也称强制类型转换(cast),有时需要强制类型,有时需要强制类型转换,但它也是错误的根源,因为它关闭了编译器的类型检转换,但它也是错误的根源,因为它关闭了编译器的类型检查机制。查机制。C中的转换形式:中的转换形式:(类型说明)表达式;(类型说明)表达式;inti=100;floatf=(float)i;void*p;char*cp=(char*)p;C+中的转换形式:中的转换形式:类型名称(表达式);类型名称(表达式);inti=100;floatf=float(i);void*p;char*cp=char*(p);2.6.1显示显示类型转换类型转换2、C+中强制类型转换的几种形式中强制类型转换的几种形式cast-name(expression);其中的cast-name可以为:static_cast:静态转换静态转换dynamic_cast:动态转换:动态转换const_cast:常量转换:常量转换reinterpret_cast:用于不相关的类型转换,如将:用于不相关的类型转换,如将int转换成指针等。转换成指针等。例:doubleb=-67.89;intc=b;intc=static_cast(b);2.6.1显示显示类型转换类型转换3、【例例2-7】利用利用const_cast转换去掉指针和引用的转换去掉指针和引用的const限制。限制。/Eg2-7.cpp#includevoidsqrt(constint*x)int*p=const_cast(x);/const_cast去掉了去掉了x的的const限制限制*p=(*p)*(*p);/p和和x指向同一内存地址,即指向同一内存地址,即*p实际修改了实际修改了*xvoidsqr(const&x)const_cast(x)=x*x;/const_cast去掉了去掉了x的的const限制,否则不能修改限制,否则不能修改xvoidmain()inta=5;sqrt(&a);/通过指针将通过指针将a改为改为25coutaendl;/输出输出25sqr(a);/通过引用将通过引用将a改为改为625coutaendl;/输出输出6252.6.1显示显示类型转换类型转换2.7函数函数本节主要介绍本节主要介绍C+函数的相关知识,函数的相关知识,应着重了解应着重了解函数默认参数、引用参函数默认参数、引用参数数及返回值、及返回值、重载函数重载函数及其解析过及其解析过程等方面的知识。程等方面的知识。1、相关概念、相关概念函数原型函数原型就是常说的就是常说的函数声明,函数声明,由函数返回类由函数返回类型、函数名及参考表构成。型、函数名及参考表构成。形式如下:形式如下:rtypef_name(type1p1,type2p2,);函数定义函数定义就是给出函数体的函数声明(即函数的程就是给出函数体的函数声明(即函数的程序代码)序代码)函数原型函数原型描述了函数的描述了函数的接口接口。它描述了函数必须接。它描述了函数必须接收的信息类型(参数表),以及它的返回类型。收的信息类型(参数表),以及它的返回类型。调用函数前必须声明或定义调用函数前必须声明或定义函数原型函数原型常被放在常被放在头文件头文件中。中。2.7.1函数函数原型原型2.7.1函数原型函数原型2、【例例2-8】函数原型的一个简单例子。函数原型的一个简单例子。/Eg2-8.cpp#includedoublesqrt(doublef);/函数原型函数原型voidmain()for(inti=0;i10;i+)couti*i=sqrt(i)endl;doublesqrt(doublef)returnf*f;2.7.1函数原型函数原型3、C+函数原型的一些注意事项函数原型的一些注意事项函数原型中的参数名可以省略。函数原型中的参数名可以省略。函数定义时的返回类型、函数名、参数个数、参数的次序和类型必须与函数原型相符,但参数名可以不同。如果函数的定义出现在程序中第一次调用此函数之前,就不需要函数原型。C+与C语言的函数参数声明存在区别。2.7.1函数原型函数原型如果函数原型中没有指出函数的返回类型(包如果函数原型中没有指出函数的返回类型(包括主函数括主函数main),),C+将默认该函数的返回类将默认该函数的返回类型是型是int。如果一个函数没有返回类型,则必须指明它的如果一个函数没有返回类型,则必须指明它的返回类型为返回类型为void。在在C+中无参数函数与中无参数函数与C语言是有区别的。在语言是有区别的。在C+中,下面的函数原型等价:中,下面的函数原型等价:intf();/该函数没有参数该函数没有参数intf(void);/该函数不需要参数该函数不需要参数在在C语言中,下面的函数是不同的:语言中,下面的函数是不同的:intf();/该函数可以有很多个参数该函数可以有很多个参数intf(void);/该函数不需要参数该函数不需要参数2.7.2函数函数默认参数默认参数1、概念、概念C+允许为函数提供允许为函数提供默认默认参数。在调用具有参数。在调用具有默认默认参数的函数时,如果没有提供调用参数,参数的函数时,如果没有提供调用参数,C+将自动把将自动把默认默认参数值作为相应参数的值。参数值作为相应参数的值。2、规则、规则只能只能默认默认全部或部分右边的参数全部或部分右边的参数函数声明和定义同时存在时,仅声明中才能函数声明和定义同时存在时,仅声明中才能出现出现默认默认的说明的说明.默认默认参数的声明必须先于函数调用参数的声明必须先于函数调用.2.7.2函数函数默认参数默认参数3、【例例2-9】默认参数的一个应用例子。默认参数的一个应用例子。/Eg2-9.cpp#includedoublesqrt(doublef=1.0);voidmain()coutsqrt()endl;/采用默认参数采用默认参数coutsqrt(5)endl;doublesqrt(doublef)returnf*f;2.7.2函数函数默认参数默认参数4、注意、注意一旦某个参数开始指定默认值,它右边的所有参数都必须指定默一旦某个参数开始指定默认值,它右边的所有参数都必须指定默认。认。intf(inti1,inti2=2,inti3=0);/正确正确intg(inti1,inti2=0,inti3);/错误,错误,i3没有缺省值没有缺省值inth(inti1=0,inti2,inti3=0);/错误,错误,i1缺省后,其右缺省后,其右i2没有缺省没有缺省在调用具有默认在调用具有默认参数值的函数时,若某个实参默认参数值的函数时,若某个实参默认,其右边的所,其右边的所有实参都应默认有实参都应默认。例如:。例如:intf(inti1=1,inti2=2,inti3=0)returni1+i2+i3;针对此函数,有如下调用:针对此函数,有如下调用:f();/正确,正确,i1=1,i2=2,i3=0f(3);/正确,正确,i1=3,i2=2,i3=0f(2,3);/正确,正确,i1=2,i2=3,i3=0f(4,5,6);/正确,正确,i1=4,i2=5,i3=6f(,2,3);/错误,错误,i1缺省,而右边的缺省,而右边的i2,i3没有没有2.7.3引用参数引用参数1、C+参数传的主要形式参数传的主要形式传值、传指针、传引用传值、传指针、传引用2、传引用参数的意义、传引用参数的意义需要从函数中返回多于一个值。需要从函数中返回多于一个值。需要修改实参值本身。需要修改实参值本身。传递地址可以节省复制大量数据的内存空间传递地址可以节省复制大量数据的内存空间和时间。和时间。3、引用应用:、引用应用:C语言用指针交换两个变量值语言用指针交换两个变量值/Eg2-11.cpp#includevoidswap(int*a,int*b)inttemp=*a;*a=*b;*b=temp;voidmain()intx=5;inty=10;swap(&x,&y);coutx=xty=yendl;2.7.3引用参数引用参数3、引用应用:、引用应用:C+可用引用交换两个变量值可用引用交换两个变量值/Eg2-12.cpp#includevoidswap(int&a,int&b)inttemp=a;a=b;b=temp;voidmain()intx=5;inty=10;swap(x,y);coutx=xty=y20&n0)return1;rSquar=n*n;rCubed=n*n*n;return0;2.7.3引用参数引用参数3、引用应用、引用应用:实现两个字符串的交换实现两个字符串的交换#includevoidSwap(char*&str1,char*&str2);voidmain()char*ap=hello;char*bp=howareyou?;coutapendlbpendl;Swap(ap,bp);cout交换以后交换以后:n;coutapendlbpendl;voidSwap(char*&str1,char*&str2)char*temp=str1;str1=str2;str2=temp;2.7.3引用参数引用参数2.7.3引用参数引用参数4、引用传递大型对象的效率问题、引用传递大型对象的效率问题C+引入引用的另一原因是传递大型的引入引用的另一原因是传递大型的类对象或数据结构。在按值传递参数的类对象或数据结构。在按值传递参数的情况下,传递小型类对象和结构变量不情况下,传递小型类对象和结构变量不存在效率问题,但在传递大型结构变量存在效率问题,但在传递大型结构变量或类对象时,需要进行大量的数据复制或类对象时,需要进行大量的数据复制(把实参对象或结构变量的值复制到函(把实参对象或结构变量的值复制到函数参数在运行栈分配的存储区域中),数参数在运行栈分配的存储区域中),效率就太低了。效率就太低了。2.7.3引用参数引用参数【例例2-13】按值传递参数与引用传递参数的效率对比。按值传递参数与引用传递参数的效率对比。/Eg2-13.cpp#include#includestructstudentcharname12;/学生姓名学生姓名charId8;/学号学号intage;/年龄年龄doublescore10;/10科成绩科成绩;voidprint(studenta)couta.nameendl;couta.Idendl;couta.ageendl;for(inti=0;i10;i+)couta.scoreiendl;voidmain()studentx;/对对x进行赋值的语句省掉了进行赋值的语句省掉了print(x);coutsizeof(x)endl;/计算计算x的内存块大小的内存块大小5、引用参数与指针参数比较、引用参数与指针参数比较指针与引用都能使函数修改实参所指对象的值,都能向函数有指针与引用都能使函数修改实参所指对象的值,都能向函数有效地传送大型类对象的地址。但引用参数更为直观方便。效地传送大型类对象的地址。但引用参数更为直观方便。指针允许传递空对象,但引用必须传递有效的对象。指针允许传递空对象,但引用必须传递有效的对象。/Eg.cppintswap(int*a,int*b)if(b)intt=*a;*a=*b;*b=t;return1;elsereturn0;voidmain()intx=9,y=20;coutswap(&x,0);/ok/ch.cppch.cppint int swap(intswap(int&a,inta,int&b)&b)if(b)if(b)int t=a;a=b;b=t;int t=a;a=b;b=t;return 1;return 1;else return 0;else return 0;void main()void main()intint x=9,y=20;x=9,y=20;coutcoutswap(x,0);/errswap(x,0);/err 2.7.3引用参数引用参数6、传递引用参数潜在的问题、传递引用参数潜在的问题可能隐藏错误可能隐藏错误inta=10,b=20;swap(a,b);/valueorreference?函数重载的二义性函数重载的二义性voidfn(ints)/voidfn(int&s)/voidmain()inta=5;fn(a);/invoke?2.7.3引用参数引用参数1、相关概念、相关概念除了返回

    注意事项

    本文((精品)C++面向对象程序设计教学PPT2.ppt)为本站会员(hwp****526)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开