资源描述
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.6,1.1,面向对象程序设计,面向过程程序设计的缺点:,缺点,出现,背景,缺乏,数据和代码的保护,机制,这种程序设计方法缺乏代码重用机制,面向,对象,程序设计的优点:,按习惯对问题领域进行自然分解,注重需求分析和设计,反复,数据抽象和信息隐蔽等,机理使得,对象内部实现与外界,隔离,,能对数据有效保护,继承使得代码重用成为可能,可维护性好,基本,概念,什么是,对象,?,什么是,类?,知识点概述,对象是,系统中的基本运行实体,是有特殊属性(数据)和行为方式(方法)的,实体,。,类是对具有公共的方法和一般特殊性的一组基本相同对象的描述。,基本,概念,什么是,消息,?,什么是,方法,?,知识点概述,方法是对象本身内含的执行特定操作的函数或过程,消息(,Message,)用来请求对象执行某一处理或回答某些信息的请求,例如,一个汽车对象具有,行驶,这项操作,那么要让汽车以时速,50,公里行驶的话,我们需传递给汽车对象,行驶,及,时速,50,公里,的消息,以触发这个对象。,知识点概述,优缺点,优点:,符合认识论的观点,能尽量逼真地模拟客观世界及其,事物,先进,的开发,方法,软件适应性,广,以对象为中心的程序设计,缺点:,描述局限性,具体实现困难,知识点概述,理论,基础,分类学基础,分类,聚合,泛化和特化,思维科学,基础,抽象思维,过程,概念建模与抽象思维过程,方法学基础,抽象思维阶段,具体思维阶段,感性具体,思维抽象,思维具体,被模拟的系统,感性具体,思维抽象,思维具体,针对问题的概念,抽象,抽象,思维,具体,思维,对象,类,/,子类,抽象,模型系统,映射,映射,模模,客观世界的解决方法,方法空间,客观世界的对象和操作,客观世界的对象,程序设计语言的对象和操作,输出数据,问题解空间,计算机的方法,对问题的解释,对结果的解释,基本,特征,封装性(,Encapsulation,),封装,就是隐藏对象的属性和实现细节,仅对外提供公开接口,继承性(,Inheritance,),继承,描述的不同类型之间的一种关系,它可以扩展,不同类型的,功能,基本,特征,多态性,(,Polymorphism,),多态,指的是同一个操作作用于不同的对象,可以产生不同的,效果,抽象性(,Abstract,),抽象性,是指,将具有相同属性和行为的一组对象抽象为类,面向对象程序设计,与面向过程程序设计,程序,=,(模块,+,模块,+,),模块,=,(算法),+,(数据结构),程序,=,(对象,+,对象,+,),对象,=,(数据结构,+,算法,),面向对象程序设计,与面向过程程序设计,项目,结构化程序设计,面向对象程序设计,处理对象,程序模块中数据与过程分开,对象的状态、行为封装在一起,传递机制,程序员负责调用过程实现参数传递,通过消息来传递实现并激活操作,描述形式,客观世界被描述成逻辑实体控制流,由对象来反映,相对来说更贴切,抽象方法,使用过程抽象,使用类抽象和对象抽象,结构单元,语句或表达式,类或类族,分解方法,使用功能分解,使用面向对象分解,使用语言,使用面向过程程序设计语言,使用面向对象程序设计语言,安全性,程序员确保数据及操作是正确的,封装性和消息传递防止非法访问,基于平台,大多要求基于,DOS,平台,基本要求基于,Windows,平台,维护工作量,软件维护工作量大,需修改程序,维护工作量较少,改变对象操作,方法与,步骤,描述一个解所需要的对象,问题空间中的对象,实现一个解所需要的对象,类库中所拥有要的对象,由面向对象语言实现的对象,解空间中的,对象,OOI,OOD,OOA,面向对象分析,OOA,面向对象的,设计,OOD,面向对象的,实现,OOI,1.2 C+,程序设计,返回目录,1.2.1,C+,语言的产生,C+,语言的特点,1.2.2,C+,语言的程序设计体系,1.2.3,C+,语言的产生,1982,年,,Bjarne,Stroustrup,博士在,C,语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。开始这种语言被称为,new C,,后来改为,C with Class,,,1983,年,12,月,,Rick,Mascitti,建议命名为,CplusPlus,,即,C+,。,C,+,的发展大致可分为了三个阶段:,第一阶段从,C+,语言出现到,1995,年,这一阶段,C+,语言基本上是传统类型上的面向对象语言,并且依靠接近,C,语言的效率,,在,这期间,Bjame,博士完成了经典巨著,The C+Programming Language,第一版;诞生了一个传世经典,ARM,;之后模板、异常、命名空间等相继被加入。,第二阶段从,1995,年到,2000,年,这一阶段由于,STL,库和后来的,Boost,库等程序库的出现,泛型程序设计在,C+,中比重越来越大,同时由于,Java,、,C#,等语言的出现和硬件的影响,,C+,受到了一定的冲击。,第三阶段从,2000,年至今,由于,Loki,、,MPL,等程序库为代表的产生式编程和模板元编程的出现,,C+,出现了发展上的又一个高峰,。,C,+,简介,2,支持面向对象的机制,3,支持泛型程序设计,4,功能强大的标准模板库,STL,C,+,的,特点,1,保持与,C,兼容,C,+,简介,C+,的应用领域,C+,应用,程序平台,系统级框架,机器人,及工业控制系统,高性能实时计算,手机智能设备,CAD,、,CAE,、,CAM,等,多媒体游戏等,航空航天系统等,C+,语言的程序设计体系,2,数组、指针、函数,3,静态,成员与友,元、运算符重载、继承、模块,及,STL,1,数据类型、表达式等,1.3,C+,程序开发过,程,1.3.1,面向过程程序举例,面向对象程序举例,1.3.2,返回目录,面向过程程序,举例,面向过程的程序是由函数构成的,其基本结构为:函数的定义,+,函数的调用,查看详情,程序,1-1,:输出字符串“,Hello”,#include,/*,函数功能:输出字符串“,Hello”,函数名称:,print,函数参数:,str,-,字符指针,函数返回值类型:,void,*/,void print(char*,str,),printf,(“%,f”,hello,);,int,main(),char*hello=“Hello”;,print(hello);/,函数调用,return 0;,iostream,文件,第,1,行代码,包含了输入输出头文件,iostream,,它是标准的,C+,头文件,在旧的标准,C+,中,使用的是,iostream.h,,实际上这两个文件是不同的,在编绎器,include,文件夹里它是两个文件,并且内容不同。后缀为,.h,的头文件,C+,标准明确提出不支持了,早期在,C+,中调用,.h,头文件其实相当于调用的,C,标准库,为了和,C,语言区分开,,C+,标准规定不使用后缀,.h,的头文件,例如,C,语言中的,string.h,头文件,,C+,用,cstring,,,C,语言中的,math,头文件,,C+,使用,cmath,头文件。这不只是形式上的改变,其实现也有所不同。,返回,面向过程程序,举例,#include,#include,using namespace,std,;,class Person/,类的定义,private:,String words;/,类的数据成员,public:,/,成员函数定义,/*,函数功能:给数据成员赋值,函数名称:,setWords,函数参数:,wordstring,类型,,C+,中定义的字符串类,返回类型:,void,空类型,表示没带回任何值给调用的函数,*,/,面向对象,的程序是由对象构成的,要定义对象得先定义类,。其,基本结构:类的定义,+,类的使用,void,setWords,(string word),Words=word;,/*,函数功能:输出数据成员的值,函数名称:,say,函数参数:,void,返回类型:,void,*/,void say(),Cout,words;,;,int,main(),Person girl;/Person,类对象的定义,girl.setWords,(“How are you!”);/,调用成员函数,girl.speak,();/,调用成员函数,system(pause,);,return 0;,;,面向过程程序,举例,第一,个,C+,程序,命名空间,命名空间实际上是由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间区域,把一些自己定义的变量、函数等标识符存放在这个空间中,从而与其他实体定义分隔开来。其定义格式如下所示:,namespace,空间名,namespace,是定义命名空间的关键字,空间名可以用任意合法的标识符,在,内声明空间成员,例如定义一个命名空间,A1,,代码如下所示:,namespace A1,int,a=10,;,变量,a,只在,A1,空间内(,作用域)有效,命名空间的作用就是建立一些互相分隔的作用域,把一些实体定义分隔开来,。,下一页,1.4,面向对象程序的组成元素,1.4.1,名字空间,输入输出流,1.4.2,返回目录,名字空间,解决命名冲突,使用方法:,利用,using namespace,使用名字空间,using namespace,std,;,表明,此后程序中的所有对象如没有特别声明,均来自名字空间,std,多学一招:,匿名命名空间,用域分辨符,:,为对象分别指定名字空间,std,:,cout,“Hello C+”,”结合使用,读入用户的输入,,可连续输入,,以空白(包括空格、回车、,TAB,)为分隔符。,cout,与插入运算符“,”结合使用,打印消息。通常它还会与操纵符,endl,使用,,endl,的效果是结束当前行,并将与设备关联的缓冲区(,buffer,)中的数据刷新到设备中,保证程序所产生的所有输出都写入输出流中,而,不是仅停留在内存中。,返回,1.5 C+,程序的编译与调试,1.5.1,源程序的编译与运行,程序的调试,1.5.2,返回目录,2,1,3,源程序的编译与运行,新建项目,添加源文件,编写代码,案例代码,具体查看教材例,1-1,源程序的编译与运行,C+,语言的编译环境有多种,如:,Microsoft,Vistual,Studio,,,C+Builder,,,Qt,Creator,,,Borland C+,等,其中:,Turbo,C3.0,,,Borland C+3.1,是在,DOS,环境下的编译系统。不同的编译器对,C+,的支持度是不一样的。由于,Visual Studio 2013,对,C+,标准的支持度达以,99%,,并且支持新标准,C+11,,所以本书使用,Visual Studio 2013,作为编译环境。,使用向导新建控制台项目,单击其中的“运行”,按钮或,按下,Ctrl+F5,组合键可以运行程序,程序的调试,程序中的错误分为编译错误,逻辑错误和运行时,错误,编译错误编译是就能找出来,因为它只是,C+,程序中的语法错误,;,逻辑,错误是程序功能上的一些错误,或编译器不能检测出的数组赿界错误,;,运行,时错误是运行过程中出现的错误,可能是内存没有释放可文件不能打开等错误,。,单步调试是逐语句,调试,断点调试,1.6,本章小结,(,1,)本章,主要讲述了面向对象程序设计的思想与,概念,(,2,)面向对象程序设计,的方法,。,(,3,),C,+,中输入输出的使用及,C+,的面向对象程序与面向过程程序的区别与联系,。,(,4,)最后,重点讲了,C+,程序的断点调试和单步调试。,2.1,C+,数据类型,2.2,变量与常量,2.3,运算符与表达式,2.4,控制结构,2.5,数组,2.6,函数,第,2,章,C+,基础知识,2.7,结构体,2.8,联合体,2.9,指针,2.10,面向过程程序设计规范,2.11,菜单结构的设计与实现,2.12,本章小结,返回目录,2.1.1,C+,字符集,C+,基本数据类型,2.1.2,C+,构造数据类型,2.1.3,引用,2.1.4,面向对象程序设计的基本特征,2.1.5,面向对象的程序设计方法与步骤,2.1.7,面向对象程序设计与面向过程程序设计的比较,2.1.6,2.1 C,+,数据类型,C+,字符集,C,+,字符集,字母,:,az,;,AZ,数字,:,0,1 2 3 4 5 6 7 8,9,其他符号,:,+,-*/=,._ :;?|!#%&()(,空格,),C+,基本,数据类型,知识点概述,1.,字符类型,字符,常量,:,括在单引号中的字符,。如,:,A,,特殊的字符常量:转义字符,如:,n,字符,变量,:,使用,char,进行声明的标识符,。如:,char,ch,;,字符串,常量,:,括在双引号内的字符序列,如,:,”,hello,world,!”,2.,整数类型,整,型,常量,:十进制,、八进制、十六进制的整型常量。,整,型,变量,:使用,int,进行,声明的变量,3.,浮点类型与双精度类型,浮点,常量:实数和科学计数法两种,形式,浮点变量与双精度变量:分别使用,float,和,double,进行声明,4.,空类型,:,void,C+,构造,数据类型,什么是,构造类型,?,构造类型又称为组合类型,它是由基本类型按照某种规则组合而成的,数组,:由具有相同数据类型的元素组成的,集合,结构体,:由不同的数据类型构成的一种混合的数据结构,联合,:构成联合体的数据成员共用同一段内存单元,枚举类型,:将变量的,值列举,指针类型,:存储另一变量的地址,类类型,:它定义的是一种对象类型,由数据和方法组成,知识点概述,引用,概念,:变量的别名,,和所引用变量共享内存,定义,:数据类型,&,引用变量名,=,变量名,;,使用,:,引用函数,的参数,引用,还可以做函数的返回值,程序举例,int,main(),int,a=1;,int,/,定义,b,是,a,的引用,cout,初始化后:,n;,cout,a=a&a,endl,;,cout,b=b&b,endl,;,b=3;,cout,b=3,后:,n;,cout,a=a&a,endl,;,cout,b=b&b,endl,;,int,/,定义,c,是,b,的引用,别名的别名,c=4;,cout,c=4,后:,n;,cout,a=a&a,endl,;,cout,b=b&b,endl,;,cout,c=c&c,endl,;,system(pause);,return 0;,程序,举例,void swap(,int,&x,int,int,main(),int,a=2,b=3;,cout,a=a t,a:address,=&a,endl,;,cout,b=b t,b:address,=&b,endl,;,swap(a,b);/,调用函数交换,a,b,的值,cout,a=a t,a:address,=&a,endl,;,cout,b=b t,b:address,=&b,endl,;,system,(pause);,return,0;,/,函数的定义,void swap(,int,&x,int,&y),int,tmp,;,tmp,=x;,x,=y;,y,=,tmp,;,程序,举例,int,vals,10;/,定义的全局数组变量,int,error=-1;,int,max=0;,int,&,maxValue,(,int,x,int,y);/,引用做函数返回值,int,&put(,int,n);/,返回值是引用类型,int,main(),res=0;,cout,引用仅作函数返回值:,n;,res,=,maxValue,(2,3);,cout,res=res ,tmax,=max,endl,;,cout,引用作函数返回值,返回值作了左值:,n;,put(0,)=10;/,以,put(0),函数值作为左值,,等价,vals,0,=10;,put(9,)=20;/,以,put(9),函数值作为左值,,等价,vals,9=20;,cout,vals,0 t;,cout,vals,9 y?x:y;,return,max;,/*,功能:处理数组越界,函数名称:,put,参数:,n-,整数类型,返回值:整形变量的引用,*/,int,&put(,int,n),if,(n=0&n=9)return,vals,n;,else,cout,subscript error;,return,error,;,返回目录,2.2.1,标识符与关键字,变量的定义与初始化,2.2.2,2.2,变量,与常量,常量与符号常量,2.2.3,标识符与,关键字,标识符,:,程序或系统定义的,符号,用来,作为变量名、常量名、函数名、类型名、文件名等,。,由,字母、数字、下划线组成,且由字母或下划线开头的字符串,中间不能有,空格,_sum,sum,stu_name,price,等为合法的标识符。,cout,,,52select,,,a lot,,,-W,,,sin,等为不合法标注符,。,关键字,:,也称保留字,是,C+,编译器预定义的、具有固定含义的标识符,不允许另作它用,常用关键字,int,false,if,default,enum,sizeof,public,const_cast,short,void,else,return,union,new,protected,static_cast,unsigned,typedef,switch,struct,delete,private,reinterpret_cast,long,typeid,case,class,auto,virtual,dynamic_cast,float,do,template,static,using,explicit,double,while,typename,extern,namespace,try,char,for,register,this,catch,w_char_t,break,volatile,operator,throw,bool,goto,mutable,friend,true,continue,const,inline,变量的定义与,初始化,变量定义,的,语法,:,变量的类型变量的名称;,初始化,的,方法,int,a=,;,int,b(1);,int,c;c,=1,;,常量与符号,常量,常量通过,关键字,const,来,定义,语法规则,const,变量类型变量名称;,或,const,变量类型变量名称,=,初始值,;,如:,const,double pi=3.14;,返回目录,2.3.1,运算符,表达式,2.3.2,类型转换,2.3.3,2.3,运算符,与表达式,运算符,查看详情,1.,算术运算符,:,+,、,-,、*、,/,、,%,、,+,、,-,2.,赋值运算符,:,=,、,+=,、,-=,、*,=,、,/=,、,%=,3.,关系运算符,:,、,=,、,=,、,!=,4.,逻辑运算符,:,!,、,&,、,|,5.,条件运算符,:,?:,6.,位运算符,:,、,、,|,、,、,&,7.,sizeof,运算符,(求字节运算符,),:,sizeof,8.,逗号运算符,:,9.,其它运算符,:,指针,运算符(*、,&,)、,分量运算符(,*,、,-,),、,函数调用运算符,(),、强制类型转换运算符(,type,),返回,运算符的优先级与结合性,运算符优先级决定了在表达式中各个运算符执行的先后,顺序,括号会,改变,优先级,运算符的结合方式有两种:左结合和右,结合,左结合表示运算对象先与其左边的运算符,结合,右结合表示运算对象优先与其右边的运算符结合,表达式,表达式是用于计算的式子,它由运算符、运算数和括号组成,算术表达式,:由,算术运算符和位操作运算符组成的,表达式,逻辑表达式,:由,逻辑运算符组成的表达式,。,其,表达式值的类型为逻辑,型,关系表达式,:由关系运算符组成的表达式,。,其,表达式值的类型为逻辑,型,赋值表达式,:由赋值运算符组成的,表达式,条件表达式,:由三目运算符组成的,表达式,逗号表达式,:,用逗号将若干个表达式连起来组成的表达式,类型,转换,命名空间,1,.,隐,式类型转换,隐式类型转换是由编译器自动完成的类型转换。当编译器遇到不同类型的数据参与同一运算时,会自动将它们转换为相同类型后再进行运算,2,显式类型转换,显式类型转换是由程序员显式指出的类型,转换,转换形式有,两种,类型名(表达式),(类型名),表达式,3,转换规则,当参与运算的操作数必须是,bool,型时,如果操作数是其它类型,编译系统会自动将非,0,数据转换为,true,,,0,转换为,false,位运算的操作数必须是,整数,赋值运算要求左值与右值的类型相同,,若不同,系统自动转换,为左值的类型,返回目录,2.4.1,选择结构,循环结构,2.4.2,2.4,控制结构,选择,结构,多分支结构,:,if(,条件表达式,1),语句,1;,else if(,条件表达式,2),语句,2;,else if(,条件表达式,n),语句,n;,else,语句,n+1,;,单分支结构,:,if(,条件表达式,),语句,1;,双分支结构,:,if(,条件表达式,),语句,1;,else,语句,2;,switch,语句,switch,(判断表达式),case,常量表达式,1:,语句,1;break;,case,常量表达式,2:,语句,2;break;,/,default:,语句,n+1,;,循环,结构,三要素:,循环,变量、,循环体,和循环终止,条件,循环结构,for,循环的一般,结构,for(,表达式,1;,表达式,2;,表达式,3),语句,;,while,循环的一般结构,while(,表达式,),语句,;,do-while,循环的一般结构,do,语句,;,while,(,表达式,);,expr,循环体,假,(0),真,(,非,0),while,do,循环体,expr,假,(0),真,(,非,0),while,程序举例,程序,2-7,:计算这一天是这一年的第几天,int,monthDays,=0,30,28,31,30,31,30,31,31,30,31,30,31;,int,main(),int,year,month,day,;,cout,year month day;,int,sumDays,=day;/,总天数,for,(,int,i=1;i month;i+)/,忽略闰年,sumDays,=,sumDays,+,monthDays,i;,cout,year-month-day is,cout,year ,年的第,sumDays,天,n;,system,(pause,);return,0;,程序举例,程序,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,:用公式求的近似值,直到最后一项的绝对值小于,10,-8,为止。,#include,#include,#include,using namespace,std,;,int,main(),double,s=0,t=1;,int,sgn,=1,k=1,;,do,s=s+t;,k=k+2;,sgn,=,sgn,*(-1);,t=,sgn,/double(k);,while(,fabs,(t),1e,-8);,cout,setprecision,(15)s*4,endl,;,system(pause);,return 0;,返回目录,2.5.1,一维数组,二维数组,2.5.2,字符数组和字符串类,2.5.3,2.5,数组,一维数,组,概念,:,同,一类型的多个数据分配一段连续的内存,空间,定义:,数据元素类型数组变量名称,数组元素的个数,;,数据元素类型数组变量名称,=,初值,初值,,.,;,初始化:,全部初化,,int,a=1,2,3,4,5,6;,部分,初始化,,int,a5=,1,2,3,;,访问:,下标运算符,,数组名,下标,程序举例,:,数组使用,#include,#include,using namespace,std,;,int,main,(),/,数组逆置,处理,int,myArray,=1,2,3,4,5;,int,n=,sizeof,(,myArray,)/,sizeof,(,myArray,0);/,计算数组元素的个数,int,i,j,,,tmp,;,for,(i=0,j=n-1;i j;i+,j-),tmp,=,myArray,i;,myArray,i=,myArray,j;,myArray,j=,tmp,;,for,(i=0;i n;i+),cout,setw,(5),myArray,i;,cout,endl,;system,(pause,);return,0;,二维数组,概念:数组的元素又是数组,可看作,矩阵,定义:,数据元素类型数组变量名称,数组元素的行数,数据元素的列数,;,数据元素类型数组变量名称,数据元素的列数,=,初值,初值,,.,;,初始化,分行初始化:例,int,a3=1,4,5;,不分行初始化:例,int,a3=1,2,3,4,5,;,访问:,数组名,下标,下标,程序,举例:设计,二维数组程序,输出九九乘法表,:,#include,#include,#include,using namespace,std,;,#define COL 10,#define COLUMN,10,int,main(),int,mat,COLCOLUMN=0;,int,i,j;,for,(i=1;i COL;i,+),/,矩阵元素赋值,乘法表,for,(j=1;j=i;j+),mat i,j=i*j;,for,(i=1;i COL;i,+),/,输出,乘法表,for,(j=1;j=i;j+),cout,setw,(3)j *i =,mat i,j;,cout,endl,;,/,将结果写到文件中,ofstream,outFile,(,res.txt,);/,定义输出文件流,for,(i=1;i COL;i+),for(j=1;j=i;j+),/,将结果写到输出文件流中,outFile,setw,(3)j *i =,mat i,j;,outFile,endl,;,outFile,endl,;,outFile.close,();/,关闭输出文件流,fflush,(,stdin,);/,清空输入缓冲区,getchar,();,return,0;,字符数组和字符串,类,概念,:,数组的每一个元素均为字符,类型,定义,:,char,字符数组名称,字符数组最多存放的字符元素个数,;,char*,字符指针名,=new charN;,string,字符串变量名,;,程序,举例,:将,数字字符串变为数字,#include,#include/C+,字符串,是类类型,using namespace,std,;,int,main(),string,numStr,;,long,int,number=0;,int,singleNum,;,cout,输入一个数字字符串,numStr,;,int,i=0;,while,(,numStr,i!=0),/,将单个字符变为数字,,48,是,0,的,ASC,码值,singleNum,=,numStr.at,(i)-48;,number,=number*10+,singleNum,;,i,+;,cout,numStr,=,numStr,endl,;,cout,number=number,endl,;,fflush,(,stdin,);,getchar,();return,0;,返回目录,2.6.1,函数的定义,函数原型的声明,2.6.2,函数的调用,2.6.3,内联函数,2.6.4,函数的重载,2.6.5,递归函数,2.6.7,带缺省值的函数,2.6.6,2.6,函数,函数的定义,概念:,实现某一功能的相关语句组织在一起,并给之注明相应的名称,这种形式的组合就称为,函数,功能:,C,+,程序的基本模块,函数组成,C+,程序,至少含有一个,main,函数,main,是程序运行的入口,分类:,是否为系统预定义,分为库函数和用户自定义函数,是否有参:有参函数和无参函数,函数原型的,声明,编译器遇到一个函数调用时,需要判断该函数调用是否正确,该机制即函数原型,。,C+,中,函数声明就是函数,原型,函数原型的声明,函数原型是一条程序语句,它,必须,以,“,;,”分号结束,;,由函数返回类型、函数名和参数表,构成,函数返回值类型 函数名,(),;,int,area(,int,int,);,int,area(,int,length,int,width);,函数原型和函数定义在返回类型、函数名和参数表上必须完全一致,函数的,调用,直接调用,适用于函数的返回值为空,或返回值不需要被保存的情况,表达式调用,将函数调用放到一个表达式中,让其参与,运算,一般用在赋值表达式,中,y=sin(x);,嵌套调用,一个函数调用的结果作另一个函数调用的,参数,m=max(,a,max,(,b,c,);,参数传递,传值,传引用,传地址,C+,的函数调用,过程就是,栈,空间操作的过程,(,1,)建立被调函数的栈空间;,(,2,)保护调用函数的运行状态和返回地址;,(,3,)传递参数;,(,4,)将控制权转交给被调函数;,(,5,)函数运行完成后,复制返回值到函数数据块的底部;,(,6,)恢复调用函数的运行状态;,(,7,)返回到调用函数。,分析程序的执行过程,int,funcA,(,int,x,int,y);,int,main(),int,a=6,b=12;,a=,funcA,(a,b);,int,funcA,(,int,x,int,y,),int,n=5;,n=,x+y,;,return n;,main(),b,12,a,6,操作系统运行状态及返回地址,返回值,0,运行程序,执行,main(),funcA,(),n,5,y,12,x,6,main(),运行状态及返回地址,返回值,main(),b,12,a,6,操作系统运行状态及返回地址,返回值,0,调用函数,funcA(a,b),main,函数的临时空间,funcA,(),n,5 18,y,12,x,6,main(),运行状态及返回地址,返回值,main(),b,12,a,6,操作系统运行状态及返回地址,返回值,0,调用函数,funcA,(a,b),,,执行,n=,x+y,;,funcA,(),n,18,y,12,x,6,main(),运行状态及返回地址,返回值,18,main(),b,12,a,6,操作系统运行状态及返回地址,返回值,0,调用函数,funcA,(a,b),,执行,return n;,18,12,6,main(),运行状态及返回地址,18,main(),b,12,a,6 18,操作系统运行状态及返回地址,返回值,0,返回到,main(),函数,中,,a=,funcA,(a,b);,内联,函数,内联扩展(,inline expansion,)简称为内联(,inline,),内联函数也称为内嵌,函数,函数的定义或声明前加上关键字,inline,一个函数定义为内联函数后,在程序编译阶段,编译器就会把每次调用该函数的地方都直接替换为该函数体中的代码,由此省去函数调用的空间分配、保存现场、参数传递和返回操作等,从而加快整个程序的执行,速度,内联函数可以在一开始仅定义或声明一次,但必须在函数被调用之前定义或声明,函数的,重载,功能相似而参数类型不同的,函数可以,使用相同的函数名,这就是函数,重载,参数类型不同,void sort(,int,*,arr,int,n);,void sort(float*,arr,int,n);,参数个数不同,int,max(,int,a,int,b);,int,max(,int,a,int,b,int,c);,参数顺序不同,void find(float*,arr,int,n,float,x);,void find(float*,arr,float,x,int,n),;,#include,using namespace,std,;,int,ABS(,int,);,double ABS(double);,float ABS(float);,int,main,(),int,x1,=-12;,double,x2,=-12.0;,float,x3,=-12.0;,cout,ABS(,x1,),endl,;,cout,ABS(,x2,),endl,;,cout,ABS(,x3,),0?a,:-a);,double ABS(double a),return(a,0?a,:-a);,float ABS(float a),return(a,0?a,:-a);,程序举例,:返回一个数的绝对值,只要参数个数不同,参数类型不同,参数顺序不同,函数就可以重载。然而,只是返回类型不同则不允许重载。,void,func,(,int,a);,void,func,(char a);,void,func,(char a,int,b);,void,func,(,int,a,char b);,char,func,(,int,a);,C+,按下列三个步骤的先后顺序找到匹配的函数并调用之。,寻找一个,严格匹配,,如果找到了,就调用那个函数。,通过相容类型的,隐式转换,寻求一个匹配。,通过,用户定义的转换寻求一个匹配,,若能查出唯一的一组转换,就用那个函数。,#include,using namespace,std,;,void print(,int,);,void print(double);,int,main(),print(1);,print(1.0);,print(a);,print(,3.14f,);,输出:,int,:1,double:1,int,:97,double:3.14,void print(,int,a),cout,int,:a,endl,;,void print(double a),cout,double:a,endl,;,程序举例,:编程求圆、矩形、梯形的,面积,double,area(double r,),return,3.14*r*r,;,double area(double,h,double,w,),return,h*w,;,double area(double,a,double,b,double,h,),return,(,a+b,)*h/2,;,#include,using namespace,std,;,double area(double r);,double area(double,h,double,w);,double area(double,a,double,b,double,h);,int,main(),double r=23.3;,double,h1,=,12,w,=5,,,a=,7,b,=8,h2,=3,;,cout,area(r),endl,;,cout,area(,h1,w,),endl,;,cout,area(,a,b,h2,);,带缺省值的,函数,C+,可以给函数声明中的参数
展开阅读全文