《c++程序设计完整版课件全套ppt教学教程最全整套电子教案电子讲义(最新).ppt》由会员分享,可在线阅读,更多相关《c++程序设计完整版课件全套ppt教学教程最全整套电子教案电子讲义(最新).ppt(451页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1.1 面向对象程序设计1.2 C+程序设计1.3 C+程序的开发过程1.4 面向对象程序的组成元素第1章 绪论1.5 C+程序的编译与调试1.6 本章小结返回目录1.1.1面向对象程序设计出现的背景面向对象程序设计中的基本概念1.1.2面向对象程序设计的优缺点1.1.3面向对象方法的理论基础1.1.4面向对象程序设计的基本特征1.1.5面向对象的程序设计方法与步骤1.1.7面向对象程序设计与面向过程程序设计的比较1.1.61.1 面向对象程序设计面向过程程序设计的缺点:缺点出现背景缺乏数据和代码的保护机制这种程序设计方法缺乏代码重用机制面向对象程序设计的优点:按习惯对问题领域进行自然分解注重
2、需求分析和设计反复数据抽象和信息隐蔽等机理使得对象内部实现与外界隔离,能对数据有效保护继承使得代码重用成为可能可维护性好基本概念什么是对象?什么是类?知识点概述对象是对象是系统中的基本运行实体,是有特殊属性(数据)系统中的基本运行实体,是有特殊属性(数据)和行为方式(方法)的和行为方式(方法)的实体实体。类是对具有公共的方法和一般特殊性的一组基本相同对象的描述。基本概念什么是消息?什么是方法?知识点概述方法是对象本身内含的执行特定操作的函数或过程方法是对象本身内含的执行特定操作的函数或过程消息(Message)用来请求对象执行某一处理或回答某些信息的请求例如,一个汽车对象具有行驶这项操作,那么
3、要让汽车以时速50公里行驶的话,我们需传递给汽车对象行驶及时速50公里的消息,以触发这个对象。知识点概述优缺点优点:优点:符合认识论的观点能尽量逼真地模拟客观世界及其事物先进的开发方法软件适应性广以对象为中心的程序设计缺点:缺点:描述局限性具体实现困难知识点概述理论基础分类学基础分类聚合泛化和特化思维科学基础抽象思维过程概念建模与抽象思维过程方法学基础抽象思维阶段具体思维阶段感性具体思维抽象思维具体被模拟的系统感性具体思维抽象思维具体针对问题的概念抽象抽象思维具体思维对象类/子类抽象模型系统映射映射模模客观世界的解决方法方法空间客观世界的对象和操作客观世界的对象程序设计语言的对象和操作输出数据
4、问题解空间计算机的方法对问题的解释对结果的解释基本特征封装性(Encapsulation)封装就是隐藏对象的属性和实现细节,仅对外提供公开接口继承性(Inheritance)继承描述的不同类型之间的一种关系,它可以扩展不同类型的功能基本特征多态性(Polymorphism)多态指的是同一个操作作用于不同的对象,可以产生不同的效果抽象性(Abstract)抽象性是指将具有相同属性和行为的一组对象抽象为类面向对象程序设计与面向过程程序设计程序=(模块+模块+)模块=(算法)+(数据结构)程序=(对象+对象+)对象=(数据结构+算法)面向对象程序设计与面向过程程序设计项目项目结构化程序设计结构化程序
5、设计面向对象程序设计面向对象程序设计处理对象处理对象程序模块中数据与过程分开对象的状态、行为封装在一起传递机制传递机制程序员负责调用过程实现参数传递通过消息来传递实现并激活操作描述形式描述形式客观世界被描述成逻辑实体控制流由对象来反映,相对来说更贴切抽象方法抽象方法使用过程抽象使用类抽象和对象抽象结构单元结构单元语句或表达式类或类族分解方法分解方法使用功能分解使用面向对象分解使用语言使用语言使用面向过程程序设计语言使用面向对象程序设计语言安全性安全性程序员确保数据及操作是正确的封装性和消息传递防止非法访问基于平台基于平台大多要求基于DOS平台基本要求基于Windows平台维护工作量维护工作量软
6、件维护工作量大,需修改程序维护工作量较少,改变对象操作方法与步骤描述一个解所需要的对象问题空间中的对象实现一个解所需要的对象类库中所拥有要的对象由面向对象语言实现的对象解空间中的对象OOIOODOOA面向对象分析OOA面向对象的设计OOD面向对象的实现OOIC+语言的产生1982年,BjarneStroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。开始这种语言被称为newC,后来改为CwithClass,1983年12月,RickMascitti建议命名为CplusPlus,即C+。C+的发展大致可分为了三个阶段:第一阶段从C+语言出现到1995年,这一阶
7、段C+语言基本上是传统类型上的面向对象语言,并且依靠接近C语言的效率,在这期间Bjame博士完成了经典巨著TheC+ProgrammingLanguage第一版;诞生了一个传世经典ARM;之后模板、异常、命名空间等相继被加入。第二阶段从1995年到2000年,这一阶段由于STL库和后来的Boost库等程序库的出现,泛型程序设计在C+中比重越来越大,同时由于Java、C#等语言的出现和硬件的影响,C+受到了一定的冲击。第三阶段从2000年至今,由于Loki、MPL等程序库为代表的产生式编程和模板元编程的出现,C+出现了发展上的又一个高峰。C+简介2支持面向对象的机制3支持泛型程序设计4功能强大的
8、标准模板库STLC+的的特特点点1保持与C兼容C+简介C+的应用领域的应用领域C+应用应用程序平台程序平台系统级框架系统级框架机器人机器人及工业控及工业控制系统制系统高性能实时计算高性能实时计算手机智能设备手机智能设备CAD、CAE、CAM等等多媒体游戏等多媒体游戏等航空航天系统等航空航天系统等C+语言的程序设计体系2数组、指针、函数3静态成员与友元、运算符重载、继承、模块及STL1数据类型、表达式等1.3 C+程序开发过程1.3.1面向过程程序举例面向对象程序举例1.3.2返回目录面向过程程序举例面向过程的程序是由函数构成的,其基本结构为:函数的定义+函数的调用查看详情程序1-1:输出字符串
9、“Hello”#include/*函数功能:输出字符串“Hello”函数名称:print函数参数:str-字符指针函数返回值类型:void*/voidprint(char*str)printf(“%f”,hello);intmain()char*hello=“Hello”;print(hello);/函数调用return0;iostream文件文件第1行代码包含了输入输出头文件iostream,它是标准的C+头文件,在旧的标准C+中,使用的是iostream.h,实际上这两个文件是不同的,在编绎器include文件夹里它是两个文件,并且内容不同。后缀为.h的头文件C+标准明确提出不支持了,早期
10、在C+中调用.h头文件其实相当于调用的C标准库,为了和C语言区分开,C+标准规定不使用后缀.h的头文件,例如C语言中的string.h头文件,C+用cstring,C语言中的math头文件,C+使用cmath头文件。这不只是形式上的改变,其实现也有所不同。返回面向过程程序举例#include#includeusingnamespacestd;classPerson/类的定义private:Stringwords;/类的数据成员public:/成员函数定义/*函数功能:给数据成员赋值函数名称:setWords函数参数:wordstring类型,C+中定义的字符串类返回类型:void,空类型,表示
11、没带回任何值给调用的函数*/面向对象的程序是由对象构成的,要定义对象得先定义类。其基本结构:类的定义+类的使用voidsetWords(stringword)Words=word;/*函数功能:输出数据成员的值函数名称:say函数参数:void返回类型:void*/voidsay()Coutwords;intmain()Persongirl;/Person类对象的定义girl.setWords(“Howareyou!”);/调用成员函数girl.speak();/调用成员函数system(pause);return0;面向过程程序举例第一个C+程序命名空间命名空间命名空间实际上是由程序设计者命
12、名的内存区域,程序设计者可以根据需要指定一些有名字的空间区域,把一些自己定义的变量、函数等标识符存放在这个空间中,从而与其他实体定义分隔开来。其定义格式如下所示:namespace空间名namespace是定义命名空间的关键字,空间名可以用任意合法的标识符,在内声明空间成员,例如定义一个命名空间A1,代码如下所示:namespaceA1inta=10;变量a只在A1空间内(作用域)有效,命名空间的作用就是建立一些互相分隔的作用域,把一些实体定义分隔开来。下一页1.4 面向对象程序的组成元素1.4.1名字空间输入输出流1.4.2返回目录名字空间解决命名冲突,使用方法:解决命名冲突,使用方法:利用
13、usingnamespace使用名字空间usingnamespacestd;表明此后程序中的所有对象如没有特别声明,均来自名字空间std多学一招:匿名命名空间用域分辨符:为对象分别指定名字空间std:cout“HelloC+”结合使用,读入用户的输入,可连续输入,以空白(包括空格、回车、TAB)为分隔符。cout与插入运算符“”结合使用,打印消息。通常它还会与操纵符endl使用,endl的效果是结束当前行,并将与设备关联的缓冲区(buffer)中的数据刷新到设备中,保证程序所产生的所有输出都写入输出流中,而不是仅停留在内存中。返回1.5 C+程序的编译与调试1.5.1源程序的编译与运行程序的调
14、试1.5.2返回目录213源程序的编译与运行新建项目新建项目添加源文件添加源文件编写代码编写代码 案例代码具体查看教材例1-1源程序的编译与运行C+语言的编译环境有多种,如:MicrosoftVistualStudio,C+Builder,QtCreator,BorlandC+等,其中:TurboC3.0,BorlandC+3.1是在DOS环境下的编译系统。不同的编译器对C+的支持度是不一样的。由于VisualStudio2013对C+标准的支持度达以99%,并且支持新标准C+11,所以本书使用VisualStudio2013作为编译环境。使用向导新建控制台项目单击其中的“运行”按钮或按下Ct
15、rl+F5组合键可以运行程序程序的调试程序中的错误分为编译错误,逻辑错误和运行时错误编译错误编译是就能找出来,因为它只是C+程序中的语法错误;逻辑错误是程序功能上的一些错误,或编译器不能检测出的数组赿界错误;运行时错误是运行过程中出现的错误,可能是内存没有释放可文件不能打开等错误。单步调试是逐语句调试断点调试1.6 本章小结(1)本章主要讲述了面向对象程序设计的思想与概念(2)面向对象程序设计的方法。(3)C+中输入输出的使用及C+的面向对象程序与面向过程程序的区别与联系。(4)最后重点讲了C+程序的断点调试和单步调试。2.1 C+数据类型2.2 变量与常量2.3 运算符与表达式2.4 控制结
16、构2.5 数组2.6 函数第2章 C+基础知识2.7 结构体2.8 联合体2.9 指针2.10 面向过程程序设计规范2.11 菜单结构的设计与实现2.12 本章小结返回目录2.1.1C+字符集C+基本数据类型2.1.2C+构造数据类型2.1.3引用2.1.4面向对象程序设计的基本特征2.1.5面向对象的程序设计方法与步骤2.1.7面向对象程序设计与面向过程程序设计的比较2.1.62.1 C+数据类型C+字符集C+字符集字母字母:az;AZ数字数字:0123456789其他符号其他符号:+-*/=,._:;?|!#%&()(空格)C+基本数据类型知识点概述1.字符类型字符类型字符常量:括在单引号
17、中的字符。如:A,特殊的字符常量:转义字符,如:n字符变量:使用char进行声明的标识符。如:charch;字符串常量:括在双引号内的字符序列,如:”hello,world!”2.整数类型整数类型整型常量:十进制、八进制、十六进制的整型常量。整型变量:使用int进行声明的变量3.浮点类型与双精度类型浮点类型与双精度类型浮点常量:实数和科学计数法两种形式浮点变量与双精度变量:分别使用float和double进行声明4.空类型空类型:voidC+构造数据类型什么是构造类型?构造类型又称为组合类型,它是由基本类型按照某种规则组合而成的构造类型又称为组合类型,它是由基本类型按照某种规则组合而成的数组数
18、组:由具有相同数据类型的元素组成的集合结构体结构体:由不同的数据类型构成的一种混合的数据结构联合联合:构成联合体的数据成员共用同一段内存单元枚举类型枚举类型:将变量的值列举指针类型指针类型:存储另一变量的地址类类型类类型:它定义的是一种对象类型,由数据和方法组成知识点概述 引用概念概念:变量的别名,和所引用变量共享内存定义定义:数据类型&引用变量名=变量名;使用使用:引用函数的参数引用还可以做函数的返回值程序举例intmain()inta=1;int&b=a;/定义b是a的引用cout初始化后:n;couta=a&aendl;coutb=b&bendl;b=3;coutb=3后:n;couta
19、=a&aendl;coutb=b&bendl;int&c=b;/定义c是b的引用,别名的别名c=4;coutc=4后:n;couta=a&aendl;coutb=b&bendl;coutc=c&cendl;system(pause);return0;程序举例voidswap(int&x,int&y);intmain()inta=2,b=3;couta=ata:address=&aendl;coutb=btb:address=&bendl;swap(a,b);/调用函数交换a,b的值couta=ata:address=&aendl;coutb=btb:address=&bendl;system(
20、pause);return0;/函数的定义voidswap(int&x,int&y)inttmp;tmp=x;x=y;y=tmp;程序举例intvals10;/定义的全局数组变量interror=-1;intmax=0;int&maxValue(intx,inty);/引用做函数返回值int&put(intn);/返回值是引用类型intmain()res=0;cout引用仅作函数返回值:n;res=maxValue(2,3);coutres=restmax=maxendl;cout引用作函数返回值,返回值作了左值:n;put(0)=10;/以put(0)函数值作为左值,等价vals0=10;p
21、ut(9)=20;/以put(9)函数值作为左值,等价vals9=20;coutvals0t;coutvals9y?x:y;returnmax;/*功能:处理数组越界函数名称:put参数:n-整数类型返回值:整形变量的引用*/int&put(intn)if(n=0&n=9)returnvalsn;elsecoutsubscripterror;returnerror;返回目录2.2.1标识符与关键字变量的定义与初始化2.2.22.2 变量与常量常量与符号常量2.2.3标识符与关键字标识符标识符:程序或系统定义的符号用来作为变量名、常量名、函数名、类型名、文件名等。由字母、数字、下划线组成,且由字
22、母或下划线开头的字符串,中间不能有空格_sum,sum,stu_name,price等为合法的标识符。cout,52select,alot,-W,sin等为不合法标注符。关键字关键字:也称保留字是C+编译器预定义的、具有固定含义的标识符,不允许另作它用常用关键字intfalseifdefaultenumsizeofpublicconst_castshortvoidelsereturnunionnewprotectedstatic_castunsignedtypedefswitchstructdeleteprivatereinterpret_castlongtypeidcaseclassauto
23、virtualdynamic_castfloatdotemplatestaticusingexplicitdoublewhiletypenameexternnamespacetrycharforregisterthiscatchw_char_tbreakvolatileoperatorthrowboolgotomutablefriendtruecontinueconstinline变量的定义与初始化变量定义变量定义的语法:变量的类型变量的名称;变量的类型变量的名称;初始化初始化的方法inta=;intb(1);intc;c=1;常量与符号常量常量通过关键字关键字const来定义语法规则语法规则
24、const变量类型变量名称;变量类型变量名称;或const变量类型变量名称变量类型变量名称=初始值初始值;如:如:constdoublepi=3.14;返回目录2.3.1运算符表达式2.3.2类型转换2.3.32.3 运算符与表达式运算符查看详情1.算术运算符算术运算符:+、-、*、/、%、+、-2.赋值运算符赋值运算符:=、+=、-=、*=、/=、%=3.关系运算符关系运算符:、=、=、!=4.逻辑运算符逻辑运算符:!、&、|5.条件运算符条件运算符:?:6.位运算符位运算符:、|、&7.sizeof运算符运算符(求字节运算符):sizeof8.逗号运算符逗号运算符:,9.其它运算符其它运算
25、符:指针运算符(*、&)、分量运算符(*、-)、函数调用运算符()、强制类型转换运算符(type)返回运算符的优先级与结合性运算符优先级决定了在表达式中各个运算符执行的先后顺序括号会改变优先级运算符的结合方式有两种:左结合和右结合左结合表示运算对象先与其左边的运算符结合右结合表示运算对象优先与其右边的运算符结合表达式表达式是用于计算的式子,它由运算符、运算数和括号组成表达式是用于计算的式子,它由运算符、运算数和括号组成算术表达式算术表达式:由算术运算符和位操作运算符组成的表达式逻辑表达式逻辑表达式:由逻辑运算符组成的表达式。其表达式值的类型为逻辑型关系表达式关系表达式:由关系运算符组成的表达式
26、。其表达式值的类型为逻辑型赋值表达式赋值表达式:由赋值运算符组成的表达式条件表达式条件表达式:由三目运算符组成的表达式逗号表达式逗号表达式:用逗号将若干个表达式连起来组成的表达式类型转换命名空间命名空间1.隐隐式类型转换式类型转换隐式类型转换是由编译器自动完成的类型转换。当编译器遇到不同类型的数据参与同一运算时,会自动将它们转换为相同类型后再进行运算2显式类型转换显式类型转换显式类型转换是由程序员显式指出的类型转换转换形式有两种类型名(表达式)类型名(表达式)(类型名)(类型名)表达式表达式3转换规则转换规则当参与运算的操作数必须是bool型时,如果操作数是其它类型,编译系统会自动将非0数据转
27、换为true,0转换为false位运算的操作数必须是整数赋值运算要求左值与右值的类型相同,若不同,系统自动转换为左值的类型返回目录2.4.1选择结构循环结构2.4.22.4 控制结构选择结构多分支结构多分支结构:if(条件表达式1)语句1;elseif(条件表达式2)语句2;elseif(条件表达式n)语句n;else语句n+1;单分支结构单分支结构:if(条件表达式)语句1;双分支结构双分支结构:if(条件表达式)语句1;else语句2;switch语句语句switch(判断表达式)case常量表达式1:语句1;break;case常量表达式2:语句2;break;/default:语句n+
28、1;循环结构三要素:循环变量、循环体和循环终止条件循环结构for循环的一般循环的一般结构结构for(表达式1;表达式2;表达式3)语句;while循环的一般结构循环的一般结构while(表达式)语句;do-while循环的一般结构循环的一般结构do语句;while(表达式);expr循环体假(0)真(非0)whiledo循环体expr假(0)真(非0)while程序举例程序2-7:计算这一天是这一年的第几天intmonthDays=0,30,28,31,30,31,30,31,31,30,31,30,31;intmain()intyear,month,day;coutyearmonthday;
29、intsumDays=day;/总天数for(inti=1;imonth;i+)/忽略闰年sumDays=sumDays+monthDaysi;coutyear-month-dayiscoutyear年的第sumDays天n;system(pause);return0;程序举例程序2-8:输入两个整数m,n,计算其最大公约数int main()int a,b;cout a b;int m=a,n=b;int r=m%n;while(r!=0)m=n;n=r;r=m%n;cout a ,b 的最大公约数是:n endl;system(pause);return 0;程序举例程序2-9:用公式求的
30、近似值,直到最后一项的绝对值小于10-8为止。#include#include#includeusingnamespacestd;intmain()doubles=0,t=1;intsgn=1,k=1;dos=s+t;k=k+2;sgn=sgn*(-1);t=sgn/double(k);while(fabs(t)1e-8);coutsetprecision(15)s*4endl;system(pause);return0;返回目录2.5.1一维数组二维数组2.5.2字符数组和字符串类2.5.32.5 数组一维数组概念概念:同一类型的多个数据分配一段连续的内存空间定义:定义:数据元素类型数组变量
31、名称数组元素的个数;数据元素类型数组变量名称=初值,初值,.;初始化:初始化:全部初化,inta=1,2,3,4,5,6;部分初始化,inta5=1,2,3,;访问:访问:下标运算符,数组名下标程序举例:数组使用#include#includeusingnamespacestd;intmain()/数组逆置处理intmyArray=1,2,3,4,5;intn=sizeof(myArray)/sizeof(myArray0);/计算数组元素的个数inti,j,tmp;for(i=0,j=n-1;ij;i+,j-)tmp=myArrayi;myArrayi=myArrayj;myArrayj=t
32、mp;for(i=0;in;i+)coutsetw(5)myArrayi;coutendl;system(pause);return0;二维数组概念:数组的元素又是数组,可看作概念:数组的元素又是数组,可看作矩阵矩阵定义:定义:数据元素类型数组变量名称数组元素的行数数据元素的列数;数据元素类型数组变量名称数据元素的列数=初值,初值,.;初始化初始化分行初始化:例inta3=1,4,5;不分行初始化:例inta3=1,2,3,4,5;访问:访问:数组名下标下标程序举例:设计二维数组程序,输出九九乘法表:#include#include#includeusingnamespacestd;#defi
33、neCOL10#defineCOLUMN10intmain()intmatCOLCOLUMN=0;inti,j;for(i=1;iCOL;i+)/矩阵元素赋值,乘法表for(j=1;j=i;j+)matij=i*j;for(i=1;iCOL;i+)/输出乘法表for(j=1;j=i;j+)coutsetw(3)j*i=matij;coutendl;/将结果写到文件中ofstreamoutFile(res.txt);/定义输出文件流for(i=1;iCOL;i+)for(j=1;j=i;j+)/将结果写到输出文件流中outFilesetw(3)j*i=matij;outFileendl;outF
34、ileendl;outFile.close();/关闭输出文件流fflush(stdin);/清空输入缓冲区getchar();return0;字符数组和字符串类概念概念:数组的每一个元素均为字符类型定义定义:char字符数组名称字符数组最多存放的字符元素个数;char*字符指针名=newcharN;string字符串变量名;程序举例:将数字字符串变为数字#include#include/C+字符串,是类类型usingnamespacestd;intmain()stringnumStr;longintnumber=0;intsingleNum;cout输入一个数字字符串numStr;inti=
35、0;while(numStri!=0)/将单个字符变为数字,48是0的ASC码值singleNum=numStr.at(i)-48;number=number*10+singleNum;i+;coutnumStr=numStrendl;coutnumber=numberendl;fflush(stdin);getchar();return0;返回目录2.6.1函数的定义函数原型的声明2.6.2函数的调用2.6.3内联函数2.6.4函数的重载2.6.5递归函数2.6.7带缺省值的函数2.6.62.6 函数函数的定义概念:概念:实现某一功能的相关语句组织在一起,并给之注明相应的名称,这种形式的组合
36、就称为函数功能:功能:C+程序的基本模块,函数组成程序的基本模块,函数组成C+程序程序至少含有一个main函数main是程序运行的入口分类:分类:是否为系统预定义,分为库函数和用户自定义函数是否有参:有参函数和无参函数函数原型的声明编译器遇到一个函数调用时,需要判断该函数调用是否正确,该机制即函数原型。C+中,函数声明就是函数原型函数原型的声明函数原型是一条程序语句,它必须必须以以“;”分号结束分号结束;由函数返回类型、函数名和参数表构成函数返回值类型函数名();intarea(int,int);intarea(intlength,intwidth);函数原型和函数定义在返回类型、函数名和参数
37、表上必须完全一致函数的调用直接调用直接调用适用于函数的返回值为空,或返回值不需要被保存的情况表达式调用表达式调用将函数调用放到一个表达式中,让其参与运算一般用在赋值表达式中y=sin(x);嵌套调用嵌套调用一个函数调用的结果作另一个函数调用的参数m=max(a,max(b,c);参数传递参数传递传值传引用传地址C+的函数调用过程就是栈栈空间操作的过程空间操作的过程(1)建立被调函数的栈空间;(2)保护调用函数的运行状态和返回地址;(3)传递参数;(4)将控制权转交给被调函数;(5)函数运行完成后,复制返回值到函数数据块的底部;(6)恢复调用函数的运行状态;(7)返回到调用函数。分析程序的执行过
38、程intfuncA(intx,inty);intmain()inta=6,b=12;a=funcA(a,b);intfuncA(intx,inty)intn=5;n=x+y;returnn;main()b12a6 操作系统运行状态及返回地址返回值0运行程序,执行main()funcA()n5y12x6main()运行状态及返回地址返回值main()b12a6操作系统运行状态及返回地址返回值0调用函数funcA(a,b)main函数的临函数的临时空间时空间funcA()n5 18y12x6main()运行状态及返回地址返回值 main()b12a6操作系统运行状态及返回地址返回值0调用函数fun
39、cA(a,b),执行n=x+y;funcA()n18y12x6main()运行状态及返回地址返回值 18main()b12a6操作系统运行状态及返回地址返回值0调用函数funcA(a,b),执行returnn;18126main()运行状态及返回地址 18main()b12a6 18操作系统运行状态及返回地址返回值0返回到main()函数中,a=funcA(a,b);内联函数内联扩展(inlineexpansion)简称为内联(inline),内联函数也称为内嵌函数函数的定义或声明前加上关键字inline一个函数定义为内联函数后,在程序编译阶段,编译器就会把每次调用该函数的地方都直接替换为该函
40、数体中的代码,由此省去函数调用的空间分配、保存现场、参数传递和返回操作等,从而加快整个程序的执行速度内联函数可以在一开始仅定义或声明一次,但必须在函数被调用之前定义或声明函数的重载功能相似而参数类型不同的函数可以使用相同的函数名,这就是函数重载参数类型不同voidsort(int*arr,intn);voidsort(float*arr,intn);参数个数不同intmax(inta,intb);intmax(inta,intb,intc);参数顺序不同voidfind(float*arr,intn,floatx);voidfind(float*arr,floatx,intn);#includ
41、eusingnamespacestd;intABS(int);doubleABS(double);floatABS(float);intmain()intx1=-12;doublex2=-12.0;floatx3=-12.0;coutABS(x1)endl;coutABS(x2)endl;coutABS(x3)0?a:-a);doubleABS(doublea)return(a0?a:-a);floatABS(floata)return(a0?a:-a);程序举例:返回一个数的绝对值只要参数个数不同,参数类型不同,参数顺序不同,函数就可以重载。然而,只是返回类型不同则不允许重载。voidfun
42、c(inta);voidfunc(chara);voidfunc(chara,intb);voidfunc(inta,charb);charfunc(inta);C+按下列三个步骤的先后顺序找到匹配的函数并调用之。寻找一个严格匹配严格匹配,如果找到了,就调用那个函数。通过相容类型的隐式转换隐式转换寻求一个匹配。通过用户定义的转换寻求一个匹配用户定义的转换寻求一个匹配,若能查出唯一的一组转换,就用那个函数。#includeusingnamespacestd;voidprint(int);voidprint(double);intmain()print(1);print(1.0);print(a)
43、;print(3.14f);输出:int:1double:1int:97double:3.14voidprint(inta)coutint:aendl;voidprint(doublea)coutdouble:aendl;程序举例:编程求圆、矩形、梯形的面积doublearea(doubler)return3.14*r*r;doublearea(doubleh,doublew)returnh*w;doublearea(doublea,doubleb,doubleh)return(a+b)*h/2;#includeusingnamespacestd;doublearea(doubler);dou
44、blearea(doubleh,doublew);doublearea(doublea,doubleb,doubleh);intmain()doubler=23.3;doubleh1=12,w=5,a=7,b=8,h2=3;coutarea(r)endl;coutarea(h1,w)endl;coutarea(a,b,h2);带缺省值的函数C+可以给函数声明中的参数使用默认值,这样在函数调用时,对应的实参就可以省略。#includeusingnamespacestd;intfunc(inta=2);intmain()coutfunc(5)endl;coutfunc()endl;intfunc(
45、inta)returna;默认参数规则一般来说,默认参数总是在函数声明时描述。函数参数默认值只能从后往前设置,而实参只能从前往后给出。例:voidfunc(inta=1,intb,intc=3);voidfunc(inta,intb=2,intc=3);func(10,15,20);func();func(12,13);func(2,20);递归函数在函数体中出现调用自身的函数称为递归函数。例:阶乘n!的数学函数描述为其对应的C+函数描述为:unsignedf(unsignedn)if(n=1)return1;returnn*f(n-1);注意:n的取值范围1n12例:Fibonacci数列的
46、数学描述为其等价的C+函数为:unsignedintf(unsignedintn)if(n=0|n=1)returnn;returnf(n-1)+f(n-2);n的取值范围1n46递归函数递归函数在运行中,其调用与被调函数的指令代码是同一个函数副本,只不过各个不同运行中的调用点,作为状态的一部分,在栈中被分别保护起来。因此,是C+的函数机制决定了递归操作的可能性与形式。递归函数例:例:n!的函数,当调用的函数,当调用f(3)时,其运行栈描述如图所示时,其运行栈描述如图所示f(1)n=1f(2)函数的状态及返回地址返回值 1f(2)n=2f(3)函数的状态及返回地址返回值 2*f(1)f(3)n
47、=3调用函数的状态及返回地址返回值 3*f(2)递归条件递归不能无限制地调用下去,因为栈空间是有限的,所以递归函数是有条件地调用自身。例如阶乘函数中的“if(n=1)return1;”当n为1时,函数就不再递归了。递归函数就有递归调用语句,且递归调用应有参数,参数值应该是逐渐逼近停止条件。例如f(n-1)相对f(n)来说,是逐渐逼近了停止条件。递归条件应先测试,后递归调用。无条件递归的逻辑错误,编译器是检查不出来的。返回目录2.7 结构体体概念概念:结构体则是任意类型元素的一个聚集,把类型不一样的一组数据放到一块连续的内存空间结构体类型的定义:结构体类型的定义:struct结构体类型名称结构体
48、类型名称数据类型数据类型1成员名称;成员名称;数据类型数据类型2成员名称;成员名称;.;结构体变量的定义结构体类型名称结构体变量的名称;结构体成员的访问结构体变量名.结构体成员名程序举例:结构体类型的定义,数组,指针的综合应用#include#includeusingnamespacestd;/Point类型结构体的定义structPointintx,y;/函数原型的声明voidinputPoint(Point*poly,intn);voidoutputPoint(Point*poly,intn);intmain()Pointpolygon5;/定义五边形intn=sizeof(polygon
49、)/sizeof(polygon0);inputPoint(polygon,n);outputPoint(polygon,n);fflush(stdin);getchar();return0;/输入结构体数组元素的值voidinputPoint(Point*poly,intn)cout输入点数组元素的x,y值:endl;for(inti=0;in;i+)cout第ipolyi.xpolyi.y;/输出Point结构体元素的值voidoutputPoint(Point*poly,intn)cout输出数组元素的值endl;Point*pt=poly;for(;ptpoly+n;pt+)cout(
50、x,y)endl;返回目录2.8 联合体联合体概念概念:union可以用相同的存储空间存储不同类别的数据类型,从而节省内存空间所有成员相对于基地址的偏移量都为0联合体(union)中的各变量是“互斥”的联合类型的联合类型的定义定义形式形式union联合类型名数据类型1成员名称;数据类型2成员名称;.;程序举例:联合体类型的定义与应用typedefunionchara;intb;doublec;Demo;intmain()charch=H;inti=5;doublec=3.14;coutch占sizeof(ch)个字节n;couti占sizeof(i)个字节n;coutc占sizeof(c)个字