




已阅读5页,还剩27页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第14章C+对C的扩充,C+与C语言的关系:C语言是C+的一个子集,C+包含了C语言的全部内容。1、C+保持与C语言的兼容,现有的许多C代码不经修改就可以为C+所用。2、C+对C语言作了很多改进:增加了一些新的运算符,使得C+应用起来更加方便。改进了类型系统,增加了安全性。引进了“引用”概念,使用引用作函数参数带来了很大方便。允许函数重载,允许设置缺省参数,这些措施提高了编程的灵活性,减少冗余性。又引进了内联函数的概念,提高了程序的效率。对变量说明更加灵活了。可以根据需要随时对变量进行说明。,14.1C+概述,14.2C+程序结构,例14.1/ThisisaC+program.#includevoidmain()doublex,y;coutxy;doublez=x+y;coutx+y=z将键盘中输入的一个数,送到它右边的变量中保存起来。5)endl表示输出新行。C+程序的源文件约定使用扩展名.cpp或.cxx,头文件约定使用扩展名.h或.hpp或.hxx。编辑好的源程序经过C+编译器编译成目标文件,其扩展名是.obj,再经过C+连接器,将目标文件与库文件中的一些代码连接起来,生成一个可执行文件。程序被运行后,一般在屏幕上显示出运行结果。,14.3C+的I/O流cin和cout,在C+中提供了新的输入/输出方式。其主要目标是建立一个类型安全、扩充性好的输入/输出系统。C+的输入/输出流库是建立在流的概念上。流类似于文件,可以把流看成是一个无限长的字符序列,它可以被顺序访问。从流中获取数据的操作称为提取操作。向流中添加数据的操作称为插入操作。C+的输入/输出流库不是语言的一部分,而是作为一个独立的函数库提供的。因此,在使用时需要包含相应的头文件“iostream.h”。输出操作被认为是插入过程,由重载的插入符“”来实现。,最一般的屏幕输出是将插入符作用在流类的对象cout上。例如:#includemain()inta=5,b=12;coutinta,b;cinab;coutabendl;提取符可以连续写多个,每个后面跟一个表达式,该表达式通常是获得输入值的变量或对象。,14.4函数的重载,函数重载(overloading)是指一个函数可以和同一作用域中的其他函数具有相同的名字,即同一个函数名可以对应着多个不同的函数实现。C+中允许两个或多个函数共用同一个函数名,但这些函数各自拥有可用于区分和唯一识别它们的参数表。它们之间有的是通过参数表中某个参数的类型不同来区别,有的是通过参数个数的不同加以区别。,1、参数类型上不同的重载函数例14.2给函数名add()定义多个函数实现,该函数的功能是求和。其中,一个函数实现求两个整型数之和,另一个函数实现求两个浮点数之和。每种实现对应着一个函数体,这些函数的名字相同,但是函数的参数的类型不同。这就是函数重载的概念。程序如下:#includeintadd(int,int);doubleadd(double,double);voidmain()coutadd(3,6)endl;coutadd(4.6,9.0)t)t=c;returnt;,函数重载要求编译器能够唯一地确定调用一个函数时应执行哪个函数代码,即采用哪个函数实现。确定函数实现时,要求从函数参数的个数和类型上来区分。也就是说,进行函数重载时,要求同名函数在参数个数上不同,或者参数类型上不同。否则,将无法实现重载。使用函数重载主要是为了处理一组完成相同或相似功能的任务,但处理的数据个数或类型不同,这样,编程时可以不必费力的给它们起名和记忆。如果两个函数参数个数和类型完全相同,仅仅是返回值不同,它们不是重载的函数。程序中出现这样两个函数,编译时将出错。函数重载可以使某些具有相似功能的函数聚集起来共同使用一个通常具有特定语义的函数名,但是当聚集起来的函数并不执行相似的操作时,就不应采用函数重载。,14.5引用,引用也是一种特殊类型的变量,它通常被认为是另一个变量的别名。定义引用变量的格式:类型这时,n具有被m引用的变量i的值,即10。,例14.4:#includevoidmain()inti=5;int运行结果:add_i=63f974add_ri=63f974i=5ri=5i=15ri=15i=20ri=20,从运行结果可以看出变量i和引用ri的地址都是0 x63f974,即这两个名字都标识的是地址为0 x63f974的存储空间。所以不论对i改写,还是对ri的改写,都是操作在同一个程序实体上,即变量i和引用ri所指称的值都是相同的。,例14.5:#includevoidmain()inti=5;int*pi=,程序运行结果:add_pi=63f970add_rpi=63f970i=5i=10i=20由程序的运行结果可见,指针变量pi和引用rpi的地址是相同的(0 x63f970),也就是说,用于存储指针的地址0 x63f970具有两个字句pi和rpi。不论是对变量i操作,还是对pi所指对象的操作以及对rpi所指对象的操作,都是对同一个程序实体的操作。,C+使用引用的主要地方是建立函数变参。将引用作为函数的形参时,改变形参的值会影响实参的值。C+使用引用参数另一个目的是为了效率。如果函数的参数是类或结构类型,参数传递时将拷贝整个形参。使用引用可以只传递指向形参的指针。引用调用是C+中的一种函数调用方式,C语言中没有这种调用方式。例14.6:函数参数是引用类型#includevoidswap(int,运算结果:a=4b=2使用引用作函数形参时,调用函数的实参要用变量名,将实参变量名赋给形参的引用,相当于在被调用函数中使用了实参的别名。于是在被调用函数中,对引用的改变,实质上就是直接地通过引用来改变实参的变量值。而且这种调用起到传址调用的作用,但它又比传址调用更方便、更直接。因此,在C+中常常使用引用作函数形参来实现在被调用函数中改变调用函数的实参值。使用引用作形参但不改变实参值,可以如下定义函数原型:intmyFunc(constint不能对param赋值,否则编译出错。,引用可以作为函数的返回值。返回引用的函数可以作为左值,即它可以出现在赋值运算符的左边。例14.7:#includeinta=1,3,5,7,9;int在实现返回引用的函数时,注意不要返回对该函数内的自动变量的引用,因为以后使用引用时,它所指向的变量已不存在。,14.6内联函数,引入内联函数的目的是为了解决程序中函数调用的效率问题。程序执行过程中,每调用一次函数,就要在调用与返回过程中付出一定的时间与空间代价用于处理现场。当函数较小又反复使用时,处理现场的开销比重会急剧增大。若把函数体嵌入函数调用处,便可以大大提高运行速度,节省开销。内联函数就可以自动实现这一功能。使用C+中新的关键字inline说明的函数称为内联函数。编译器在遇到对内联函数调用时,将尽可能的用内联函数的函数体替换函数调用的表达式。因此会增加目标程序代码量,它是以目标代码的增加为代价来换取时间的节省。使用内联函数可以加快程序执行的速度。,例14.8:编程求110中各个数的平方。#includeinlineintpower_int(intx)return(x)*(x);voidmain()inti;for(i=1;i=10;i+)intp=power_int(i);couti*i=pendl;在使用内联函数时,应注意如下几点:1、在内联函数内不允许用循环语句和开关语句。2、内联函数的定义必须出现在内联函数第一次被调用之前。3、后面讲到的类结构中所有在类说明内部定义的函数都是内联函数。,14.7函数参数的缺省值,正确的缺省参数说明:voidfun1(intx,inty=0,intz=0);voidfun2(intx,inty=0);C+允许定义或说明函数时为一个或多个形参指定缺省值。缺省参数的说明必须在形参表的最右边开始,并且中间没有间隔的非缺省参数说明。缺省参数只能定义一次,如果在函数原型中已经指定了缺省参数,那么在函数定义时不能再次说明。如果在函数调用时指定了形参对应的实参,则形参使用实参的值;如果未指定相应的实参,则形参使用缺省值。例如有如下的函数调用表达式:fun1(10);它与下列调用表达式是等价的:fun1(10,0,0);,例14.9:#includevoidfun(inta=1,intb=3,intc=5)couta=a,b=b,c=cendl;voidmain()fun();fun(7);fun(7,9);fun(7,9,11);coutOK!;执行该程序,输出如下结果:a=1,b=3,c=5a=7,b=3,c=5a=7,b=9,c=5a=7,b=9,c=11OK!该程序中在函数的定义时设置了参数的缺省值,而在调用该函数时,有的无实参,有的实参数目不足,有的实参数目与形参相等,分若干不同情况来说明缺省值的使用。,例14.10:分析下列程序的输出结果:#includeintm(8);/*等价于:intm=8;*/intadd_int(intx,inty=7,intz=m);voidmain()inta(5),b(15),c(20);ints=add_int(a,b);coutsarrayi;print(array,N);voidprint(constint*p,intn)cout*p;for(inti=1;in;i+)cout,*(p+i);coutendl;执行该程序输入如下信息:123456,输出结果如下:1,2,3,4,5,6说明:该程序中两处出现const修饰符,一是使用const定义一个int型常量N;二是使用const定义一个指向常量数组的指针。该指针所指向的数组元素是不能被更新的。该程序中有一个问题:print()函数中,实参array是一个int型数组名,形参是constint的指针,显然类型不相同,但却没有出现类型错误。这是因为形参虽然是指向一个非constint型数组array,该数组是可以更新的,但在print()函数中不能被更新。因此,一个能够更新的变量使用在一个不能被更新的环境中是不破坏类型保护,所以不出现类型不匹配错。3、使用const也可以说明引用,被说明的引用为常引用,该引用所引用的对象不能被更新。4、使用const关键字进行说明的成员函数,称为常成员函数。只有常成员函数才有资格操作常量或常对象,没有使用const关键字说明的成员函数不能用来操作常对象。,14.10动态内存分配和撤消运算符new和delete,在C+中,定义了两个新的运算符:new和delete,专门进行动态内存申请和释放,而且new能自动调用构造函数创建相应的类对象,delete能自动调用析构函数删除类对象。new和delete应匹配使用,如果delete运算符作用到不是用new返回的指针,可能引起程序运行错误。动态申请保存一个type类型的数据的内存:p=newtype;p是指向类型type的指针,type是数据类型名。释放以前用new申请的保存一个type类型数据的内存:deletep;等号左边的类型必须与右边申请的类型一致,否则,编译出错。new返回分配的内存地址,应该将它保存在一个变量中,以后用delete释放。,例14.13:#includevoidmain()int*p;p=newint;*p=888;coutadd_p=运行结果如下:add_p=0 x006
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版中级注册安全工程师(注安师)考试题库全考点含答案
- 阿拉山口市2025-2026学年八年级上学期语文月考模拟试卷
- 安徽省池州市石台县2023-2024学年高一下学期期末考试化学试题含参考答案
- 2025 年小升初茂名市初一新生分班考试语文试卷(带答案解析)-(人教版)
- 一例胸腔积液患者的护理查房课件
- 河北省2025年房地产经纪人:业主义务考试试题
- 山西省2025年企业法律顾问考试:绩效考核管理试题
- DB21-T 1638-2025 城市轨道交通自动售检票系统技术规范总体要求
- 社区消防知识培训课件教学
- 2024-2025学年河南省南阳市唐河县人教版五年级下册期中测试数学试卷(含答案)
- 2025年销售总监面试试题及答案
- 2025年信用合作社住宅贷款协议
- 摄像基础知识入门
- 2025-2030全球PCBA纳米涂层行业调研及趋势分析报告
- 2024年老年脆性骨折护理(最终版本)
- GB/T 45098-2024营运纯电动汽车换电服务技术要求
- 《工程勘察资质标准(征求意见稿)》
- 银行内部培训管理规范制度
- 体检中心沟通技巧课件
- 飞书手把手使用教程培训
- JJF 2182-2024农灌机井取水量计量监测方法
评论
0/150
提交评论