《面向对象程序设计-全部.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计-全部.ppt(488页珍藏版)》请在三一办公上搜索。
1、面向对象程序设计,面向对象程序设计,前言第1章C+语言概述第2章数据类型和表达式第3章预处理和语句第4章函数和作用域第5章类和对象(一)第6章类和对象(二)第7章继承性和派生类第8章多态性和虚函数第9章C+的I/O流库,内容简介,面向对象的基本思想,C+语言的基本概念、基本语法和编程方法,C+语言的面向对象特征,类与对象,继承与派生,多态性与虚函数,学习方法,多练习,掌握基本概念,多读程序,学习编程方法与技巧,多上机实践,加强动手能力,多剖析范例,积累编程经验,教材及参考书目,C+语言基础教程吕凤翥著清华大学出版社1999,C+语言及其程序设计教程(修订版)张国峰编著电子工业出版社1997,C
2、+语言程序设计郑莉等编著清华大学出版社1999,第1章C+语言概述,1.1C+的起源及特点1.2面向对象的方法1.3面向对象的程序设计语言C+1.4C+程序的编辑、编译和运行1.5C+的词法及词法规则1.6C+程序的结构,面向对象的由来和发展,机器语言(二进制码),汇编语言,20世纪50年代中期,FORTRAN语言,20世纪50年代中期,Algol语言,在计算机语言发展史上具有划时代的意义,引入了许多程序设计概念。如变量、数组、循环、分支等。,提出块(BeginEnd)思想,对数据进行保护,是一种初级封装。,面向对象的由来和发展(续),20世纪60年代中期,Simula 67语言,面向对象语言
3、的鼻祖,提出了对象、类的概念,并支持类的继承。,20世纪70年代中期,Ada语言,支持数据抽象类型的最重要的语言之一,但不完全支持继承。,20世纪70年代中期,Smalltalk语言,最有影响的面向对象语言之一,丰富了面向对象的概念。,20世纪80年代中期后出现C+等多种面向对象语言,C+的起源和特点,一、C+的起源,在C语言基础上为支持面向对象的程序设计研制的一个通用目的的程序设计语言;,由AT&T贝尔实验室Bjarne Stroustrup博士开发;,二、C+的特点,与C兼容,既保持了C的简洁、高效和接近汇编的特点,又比C更安全,结构化程度更高;,既支持面向过程的程序设计,又支持面向对象的
4、程序设计;,注意其两面性,1.2面向对象的方法,必须先研究事物,而后才能研究过程。必须先知道一个事物是什么,而后才能觉察这个事物中所发生的变化。路德维希费尔巴哈和德国古典文学的终结恩格斯,面向过程与面向对象程序设计,例1.1:输入任意短语或句子,计算该短语包含多少个字(word)和字符(character)。注意:输入短语时,必须在字和字之间只空一格。,面向过程与面向对象程序设计(续),面向过程的方法,#include#include void main()char ch;int wdcount,chcount;wdcount=1;chcount=0;printf(*:Please input
5、 any phrasen);while(ch=getche()!=r)chcount+;,面向过程与面向对象程序设计(续),if(ch=)wdcount+;printf(n*:The number of word is%dn,wdcount);printf(n*:The number of char is%dn,chcount);,面向对象的方法,#include#include class countpublic:,面向过程与面向对象程序设计(续),count();void process();void display();private:int wdcount,chcount;count:
6、count()wdcount=1;chcount=0;void count:process(),面向过程与面向对象程序设计(续),char ch;cout*:Please input any phraseendl;while(ch=getche()!=r)chcount+;if(ch=)wdcount+;coutendl;void count:display()printf(n*:The number of word is%dn,wdcount);,面向过程与面向对象程序设计(续),printf(n*:The number of char is%dn,chcount);void main()c
7、ount A;A.process();A.display();,运行结果,*Please input any phrase.I am a teacher*:The number of word is 4*:The number of char is 15,面向过程与面向对象程序设计(续),是一种数学思维或计算机思维方法,与人们认识世界的方法不同以不稳定的、多变的“过程”和“操作”为中心来构造系统可重用性较差,是建立在认识方法学基础上的一项技术科学,比较自然地模拟了人类认识客观世界的方式;以相对稳定的“对象”和“数据结构”为中心来构造系统可重用性较好,面向过程程序设计,面向对象程序设计,面向过程
8、与面向对象程序设计(续),面向过程程序设计,面向对象程序设计,P1,P2,P3,P4,P5,O1,O2,O3,O4,O5,Changing?,P6,面向过程与面向对象程序设计(续),面向过程程序设计,面向对象程序设计,P1,P2,P3,P5,O1,O2,O3,O4,O5,Changing?,P6,O4,抽象在面向对象中的作用,一、抽象的概念,抽象代表着一个对象的本质特征,这个特征将这个对象与所有其他种类的对象区别开来;,抽象是通过从特定的实例中抽取共同的性质以形成一般化的概念的过程;,抽象具有层次;,飞机,抽象在面向对象中的作用(续),二、面向对象抽象的原理(面向对象计算的本质),数据抽象、行
9、为共享、进化、确定性,1、数据抽象,为程序员提供了一种对数据和为操作这些数据所需要的算法的抽象;是面向对象方法的核心,包括:,模块化:构成了面向对象计算的本质;,信息隐藏:将一个模块的细节部分对用户隐藏起来,用户只能通过一个受保护的接口来访问某个模块,而不能直接访问一个模块内部的细节;,类,公有成员,抽象在面向对象中的作用(续),2、行为共享,行为是由实体的外部接口定义的,行为共享指许多实体具有相同的接口,可增加系统的灵活性;,支持行为共享的方式,分类与层次分类,多态与继承,对象,公有成员函数名,抽象在面向对象中的作用(续),3、进化,需求进化(虚函数),进化式的问题求解(继承的构造函数),4
10、、确定性,确保每个行为项都有一个正确的解释,系统不会因不能响应某一行为而失败;,确定性与类型的正确性有关;,面向对象计算的基本特征,面向对象系统的三要素:对象、类和继承;,一、对象,1、概念上,对象是代表着正在创建的系统中的一个实体;,2、实现形式上,对象是一个状态和操作(或方法)的封装体;,3、对象的定义,状态:对象的状态由这个对象的属性和这些属性的当前值决定。属性是静态的,当前值是动态的;,一个对象具有状态、行为和标识。,面向对象计算的基本特征(续),行为:一个对象如何以状态变化和消息传递的形式进行作用和对外界进行反应。,一个对象的行为代表了这个对象的外部可见的和可测试的活动;,一个对象的
11、状态代表着它的行为的累积结果;,标识:标识是一个对象固有的一种特性,该特性将这个对象与其他对象区别开来;,对象1,面向对象计算的基本特征(续),4、对象的分类,实体对象,界面对象,控制对象,按作用分类,存储信息的对象,支持系统的主要功能,5、对象的确认,发明对象:主要是控制对象;,发现对象:主要是实体对象或界面对象;,二、类,1、什么是类,面向对象计算的基本特征(续),类是创建对象的样板,它包含着所创建对象的状态描述和方法的定义。类的完整描述包含了外部接口和内部算法以及数据结构的形式;,2、类是对象的抽象及描述,类中包含生成对象的具体方法,由一个类所创建的对象称为该类的实例;,3、类是抽象数据
12、类型的实现,类是所有对象的共同的行为和不同的状态的集合体;,三、继承,继承提供了创建新类的一种方法,它的本质特征是行为共享;,面向对象计算的基本特征(续),C+语言中的抽象支持,控制抽象:用于排列任意动作的顺序的一种方法;,三种语句控制结构:顺序、循环、分支,过程抽象(面向过程):对一组输入数据的一个计算动作和产生的输出结果;,数据抽象(面向对象):类是实现抽象数据类型的工具;,C+对面向对象程序设计方法的支持,C+支持数据封装(数据抽象),C+中,类是支持数据封装的工具,对象则是数据封装的实现;,C+中包含有私有、公有和保护成员,每个可能的消息对应一个相应的方法,方法通过函数来定义;,C+中
13、通过发送消息来处理对象,C+中允许友元破坏封装性,C+中允许函数名和运算符重载,C+支持继承性,C+支持动态联编,C+对C语言的改进,增加了新的运算符::,new,delete等;,改进了类型系统,增加了安全性;,引进了引用概念;,允许函数重载,允许设置缺省参数,提高了编程的灵活性;,引进了内联函数,提高了程序的效率;,可以根据需要随时对变量进行说明;,1.4C+程序的编辑、编译和运行,一、编辑:源文件的扩展名为.cpp,二、编译,1、预处理过程,词法分析:单词,语法分析:构造程序的格式,符号表:程序中的各种符号及其属性,错误处理程序:,生成目标代码:目标文件扩展名.obj,2、编译 过程,3
14、、连接过程:可执行文件扩展名.exe,三、运行,1.4C+程序的编辑、编译和运行(续),C+的字符集,大小写的英文字母:az,AZ,数字字符:09,特殊字符,词法记号,1、关键字(保留字),词法记号(续),2、标识符,组成规则:以字母或下划线开始,其后跟零个或多个字母、数字或下划线;,不能以数字开始,正确标识符:Result,DoubleList,_first,first_错误标识符:1first,标识符的长度任意(受编译器限制);,区分字母的大小写;,不能使用系统的保留字;,例如:ADD,Add,add,词法记号(续),3、运算符,单目,双目,三目,运算符,5、分隔符,(),分隔符,:,4、
15、各种文字,数字,字符文字,串文字,文字,布尔文字,;,空白,一、空白,包括:空格、制表符、换行符、注释,功能:指示词法记号的开始和结束位置;,二、注释,/*/,/,1.6C+程序的结构,一、C+示范程序,#include void main()coutHello world!endl;,二、C+程序的组成,预处理命令,输入输出,函数,语句,变量,其他,I/O流库,提供所有的输入输出操作,cout:流类对象:提取符例如:cinPlease inputtwo integers:;cinab;endl:换行;,第2章数据类型和表达式,2.1基本数据类型2.2常量和变量2.3数组类型2.4枚举类型2.
16、5指针和引用2.6运算符2.7表达式2.8类型定义,2.1基本数据类型,一、基本数据类型,整型int,浮点型(实型),字符型char,基本数据类型,逻辑型bool,空值型void,单精度浮点数float,双精度浮点数double,用于函数和指针,2.1基本数据类型(续),二、数据类型修饰符,signed:有符号,unsigned:无符号,short:短型,long:长型,说明:,3)long修饰符还适用于双精度浮点数;,2)上述修饰符均可用于整型和字符型;,1)类型修饰符可以修饰除void、bool类型以外的其他类型;,2.1基本数据类型(续),三、基本数据类型列表,2.1基本数据类型(续),
17、说明:,1)表中的int可以省略,即在int之前有修饰符出现时,可以省略关键字int;,2)单精度类型float、双精度类型double、长精度类型long double统称浮点类型;,3)char类型和各种int类型统称整型类型;char类型变量在内存中以它的ASCII码值的形式存储;,4)字宽(字节)取决于操作系统和编译器的实现,可用sizeof验证;,常量,一、整型常量(无小数部分),1、表示方法,十进制,八进制,十六进制,2、十进制表示,由09的数字组成,不能以0开始,无前缀,例:132,-345,3、八进制表示,由0 7的数字组成,以0为前缀,例:010,-0536,4、十六进制表示
18、,由09的数字及A F的字母(大小写均可)组成,以0 x或0X为前缀,例:0 x7A,-0X3de,常量(续),5、说明:,1)长整型用L(或l)做后缀表示。例如:32765L,793l;,2)无符号型用U(或u)做后缀表示。例如:4352U,3100u;,3)unsigned long型用后缀U(或u)和L(或l)一起表示,L与U的先后顺序无关。例如:49321ul,37825LU,41152Lu;,4)无后缀时,整型常量类型按如下顺序确定:int,(unsigned),long,unsigned long,十进制时无,常量(续),二、浮点型常量,由整数部分和小数部分构成;,只有十进制表示;
19、,一般表示形式(小数表示形式):,整数部分与小数部分可以省去一部分,但不能全部省去;,例如:5.,.25,4.07,常量(续),科学表示形式:,在小数表示法后面加E(或e)表示指数;,例如:23.5E6,.032E-5,.3e10,指数部分可正可负,但必须为整数;,浮点常量的缺省数据类型为double型;,后缀F(或f)表示float类型;,后缀l(或l)表示long double类型;,常量(续),三、字符常量,由一对单引号括起的一个字符表示;,其值为所括起字符在ASCII表中的编码;,所括起字符的表示方法:,图形表示法,该方法适用于有图形符号的可打印字符;例如:A,a,*,转义序列表示法,
20、该方法适用于所有字符,尤其是无图形符号的不可打印字符;,常量(续),转义序列表示方法:以反斜线()开头,后跟字符的ASCII码值;,八进制表示:ddd;例如:101,十六进制表示:xhh;例如:x41,表2-2C+中常用转义序列符,常量(续),四、布尔常量,有两个值:true和false;,五、字符串常量(串常量,字符串),一对双引号括起的字符序列,字符序列可以包含空格、转义序列或任何其他字符,这些字符不一定是C+字符集中的字符,只要C+编译器支持即可;,例如:This is a string;,串常量与字符常量的区别:,常量(续),由一个字符型变量存放,由一维数组存放,字符常量,串常量,用单
21、引号括起,用双引号括起,字符串有一个结束符,该结束符用0表示,字符常量a在内存中占用一个字节,字符串常量a在内存中占用两个字节,可进行加、减法运算,可进行连接、拷贝运算,常量(续),六、符号常量,用来表示C+中的常量,即用一个与常量相关的标识符来替代常量;,优点:增加可读性,增强可维护性;例如:PI表示3.1415926,定义方法:使用类型说明符const;例如:const int size=80;,定义的符号常量必须初始化;,一个符号常量可看作是一个只读变量,由const定义的常量的值不可以改变;,与#define的区别?,Line1:#include Line2:const double
22、pi=3.1415;Line3:const double r;Line4:void main()Line5:Line6:double perimeter,area;Line7:perimeter=2*pi*r;Line8:pi=3.14;Line9:area=pi*r*r;Line10:coutperimeter,areaendl;Line11:,常量(续),const double r=3.2;,错误,错误,不能修改pi的值,地址值,变量,一、变量的三个基本要素,名字,类型,值,三要素,数据值,地址值,int c;c=5;,变量类型,变量名,数据值,二、变量的定义,可以在程序中随时定义变量,
23、只要在该变量被使用前定义即可;,定义格式:;例如:int a,b,c;double x,y,z;,变量(续),同一程序块内不可以定义同名变量;,初始值,变量定义时可赋初始值;,声明格式:,数据类型 标识符1(初始值1),标识符n(初始值n);数据类型 标识符1=初始值1,标识符n=初始值n;,例如:double price=15.5;int size=100;,未被初始化的变量的值或者是默认值,或者是无效值,由变量类型决定;,变量可被赋值,由变量名标识;,2.3数组类型,数目固定、类型相同的若干个变量的有序集合;,数组的定义,1、格式,;,说明:,方括号()表示数组的维;某维的大小必须是大于1
24、的常量表达式;,2、示例,int a3;char b35;const int size=80;int msize;,数组的赋值,1、数组元素的表示,下标表示:,;,说明:,为常量表达式;下标从0开始;各个元素在内存中按其下标的升序顺序连续存放;,指针表示:,数组的赋值(续),2、数组元素赋初值,利用初始值表(由一对花括号括起来的若干数据项组成)实现;,数组元素的个数要大于等于初始值表中数据项的个数;,例如:int a5=1,2,3,4,5;int a4=5,4;int b23=1,2,3,4,5,6;int b23=1,2,3,4,5,6;int c232=5,4,3,2,1,0;,3、数组元
25、素的赋值,例如:int m3;m0=5;m1=3;m2=1;,字符数组,说明:,字符数组是指数组元素是char类型的数组;注意字符常量、字符数组与字符串常量的区别;,例如:,char s14=a,b,c,d;,字符数组,char s25=a,b,c,d,0;,字符数组(字符串常量),char s25=abcd;,char s35=abcde;,char s3=abcde;,2.4枚举类型,枚举类型是若干个有名字的整型常量的集合;,枚举声明和枚举变量,一、枚举声明,enum;,由若干个枚举符组成,多个枚举符之间用逗号分隔;,枚举符是用标识符表示的整型常量,又称枚举常量;,枚举常量的值默认为最前边
26、的一个为0,其后的值依次加1;,枚举常量的值也可显式定义,未显式定义的则在前一个值的基础上加1;,枚举声明和枚举变量(续),二、枚举变量,例如:enum day Sun,Mon,Tue,Wed,Thu,Fri,Sat;enum day Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat;,枚举变量的值不一定互不相同;,enum;,多个枚举变量之间用逗号分隔;,例如:enum day d1,d2,d3;enum day Sun,Mon,Tue,Wed,Thu,Fri,Sat d1,d2,d3;,枚举变量的值,其值是该枚举变量所属的枚举声明的枚举表的某一个枚举符;,利用枚举符所表示的整
27、型值给枚举变量赋值时,需要进行类型强制;,例如:d1=Sun;d2=Sat;d3=(enum day)4;,指针,1、什么是指针,指针是用来存放某个变量的地址值的一种变量;,指针的类型是它所指向变量的类型;,指针本身数据值的类型是unsigned long int型;,例如:int a(5);int*p=,指针(续),2、如何定义指针,例如:int*pi;char(*pa)3;float*pl;int(*pf)();char*pc;int*pp;,*,*,;,3、指针的赋值(内存地址值),指针必须被赋值后才可使用;,一般变量、数组元素、结构成员的地址值为变量名前加运算符&;,数组的地址值用该数
28、组名表示;,指针(续),函数的地址值用该函数的名字表示;,例如:int a,b10;double sin(double x);int*p=,3、指针的运算,赋值运算。例如:int a,*p=,一个指针可以加上或减去一个整数值;,在一定条件下(指向同一数组的不同元素),两个指针可以相减;,在一定条件下(指向同一数组元素),两个指针可以比较;,a与&a0相同,指针和数组,1、C+中指针与数组的关系,C+通过指针访问数组中的每个元素;,数组不能参与表达式求值。在运算表达式中,一个标识数组对象的操作数在运算表达式中被自动转换为一个指向数组对象的第一个元素对象的指针值。,2、一维数组的指针表示法,C+中
29、规定:任何一个数组的名字是一个常量指针,其值是该数组的首元素的地址值;,例如:int a5;数组表示法:ai,i=0,1,2,3,4指针表示法:*(a+i),指针和数组(续),3、二维数组的指针表示法,int b25;,数组表示法:biji=0,1;j=0,1,2,3,4,指针表示法:*(*(b+i)+j)*(bi+j)(*(b+i)j(&b00+5*i+j),4、三维数组的指针表示法(同二维),5、示例,指针和数组(续),例2.1:分析下列程序的输出结果。,#include void main()static int a5=5,4,3,2,1;int i,j;i=a0+a4;j=*(a+2)
30、+*(a+4);coutiendljendl;,输出,64,指针和数组(续),例2.2:分析下列程序的输出结果。,#include void main()static char s1=abcde,s25=m,n,p,q,0;char*ps=s1;couts1 or s2endl;couts21s22s13s14endl;cout*ps*(ps+2)*(ps+4)*ps+2endl;,输出,abcde or mnpqnpdeace99,a的ASCII码值为0 x61,即97,指针和数组(续),例2.3:分析下列程序的输出结果。,#include void main()static char t3
31、5=abcd,efgh,ijkl,mnop,qrst,uvwx;coutt123*(t12+3)*(*(*(t+1)+2)+3)*(*(t1+2)+3)endl;cout*tt*(*(t+1)+1)tt02 t*t+1endl;,输出,xxxxabcdqrstijklbcd,引用,标识对象的一种机制;,对对象存储地址的抽象,但引用不是值;,引用有类型;,变量的别名;,1、定义格式,2、初始化与赋值,定义引用时必须初始化;,可以将一个引用赋给某个变量;,引用可被赋值;,引用(续),示例:int a=3;int,8,m,定义引用并初始化,将引用赋值给变量,a=8,对引用的操作就是对被引用者的操作,
32、3、引用的功能,用做函数的参数或函数的返回值;,函数不能返回对局部对象的引用;,引用(续),示例:int,错,r是局部对象,4、指针与引用的区别,指针通过地址间接访问某个变量,引用通过别名直接访问某个变量;,引用必须初始化,一旦被初始化后不得再作为其他变量的别名;,正确:int,为什么?,引用(续),例2.4:分析下列程序的输出结果。,#include void main()int val(5);int,输出,101010,引用(续),例2.5:分析下列程序的输出结果。,#include int,输出:13557,r,55,算术运算符,1、普通算术运算符,单目算术运算符:-(取负)、+(取正)
33、;,双目算术运算符:+、-、*、/、%(只用于int型);,单目运算符优先级高于双目运算符;,2、增1和减1运算符,单目运算符:+、-;,+运算符的功能:,由该运算符组成的表达式具有一定的值;,由该运算符组成的表达式计算后,其变量值要发生改变;,算术运算符(续),+运算符的两种方式:前缀方式与后缀方式;,前缀方式与后缀方式的区别:,前缀运算表达式的值为原来变量值加1;,后缀运算表达式的值为原来变量值;,两种方式的变量的值都加1;,示例:int a(1);+a;int b(1);b+;,表达式+a的值为2,变量a的值为2;,表达式b+的值为1,变量b的值为2;,关系运算符,双目运算符:、=、=、
34、=、!=,前四种优先级高于后两种;,逻辑运算符,双目运算符:&、|,优先级:&、|、!,单目运算符:!,位操作运算符,1、逻辑位运算符,单目逻辑位运算符:,双目逻辑位运算符:&、|、,双目逻辑位运算符的优先级:&、|、;,2、移位运算符,双目运算符:;,时移掉的位被丢弃,右边移出的空位补0;,时移掉的位被丢弃,左边移出的空位补0或符号位;,赋值运算符,简单赋值运算符:=,复合赋值运算符:+=、-=、*=、/=、%=、&=、|=、=、=,其他运算符,1、三目运算符,格式:d1?d2:d3,功能:先计算d1,若其非零,表达式的值为d2的值,否则为d3的值;,表达式类型:d2和d3中类型较高者的类型
35、;,2、逗号运算符,格式:d1,d2,dn,表达式的值和类型:由最后一个表达式确定;,优先级在所有运算符中最低;,3、sizeof运算符,其他运算符(续),格式:,功能:返回其后的类型说明符或表达式所表示的数在内存中所占的字节;,4、单目运算符&和*,&:取地址;,*:用在指针名前,表示取指针的内容;,5、强制类型运算符,sizeof();或sizeof();,格式:,();或();,其他运算符(续),强制类型转换可将高类型转换为低类型,是一种不安全的转换;,示例:double f(3.85);int h;h=int(f);,该转换是暂时的,一次性的;,示例:int a(3),m;double
36、 b;b=3.56+double(a);m=a+5;,运算符和优先级和结合性,P46,表2.3,表达式的种类,由运算符和操作数组成的式子;,常见的表达式,算术表达式;,逻辑表达式;,关系表达式;,赋值表达式;,条件表达式;,逗号表达式;,表达式的种类(续),注意事项:,连续的两个运算符之间用空格分隔;,可用括号来改变运算符优先级;,双目运算符的左右可以用空格符和操作数分开;,过长的表达式可分成几个表达式;,表达式的值和类型,一、确定表达式的值,二、表达式求值方法与确定类型的方法,先确定运算符的功能;,确定计算顺序:先考虑优先级,再考虑结合性;,表达式的值和类型(续),例2.6:分析下列程序的输
37、出结果(算术表达式)。,#include void main()unsigned a(0 xab),b(20);a,输出:020-1 1,表达式的值和类型(续),例2.7:分析下列程序的输出结果(关系表达式)。,#include void main()char x(m),y(n);int n;n=x3)+(y-x=1);coutnendl;,输出:113,表达式的值和类型(续),例2.8:分析下列程序的输出结果(逻辑表达式)。,#include void main()int x,y,z;x=y=z=1;-x,输出:011122212,注意逻辑表达式的求值方法,表达式的值和类型(续),例2.9:
38、分析下列程序的输出结果(条件表达式)。,#include void main()int a(3),b(4),c;c=ab?+a:+b;couta,b,cendl;c=a-b?a+b:a-3?b:a;couta,b,cendl;,3,5,53,5,8,注意三目运算符的判断条件,输出,表达式的值和类型(续),例2.10:分析下列程序的输出结果(赋值表达式)。,#include void main()int x(1),y(3),z(5);x+=y*=z-=2;coutx,y,zendl;x*=y/=z-=x;coutx,y,zendl;x=y=z=2;z=(x+=2)+(y+=4)+2;coutx,
39、y“,zendl;,输出:10,9,3-10,-1,-74,6,12,表达式的值和类型(续),例2.11:分析下列程序的输出结果(逗号表达式)。,#include void main()int a,b,c;a=1,b=2,c=a+b+3;couta,b,cendl;c=(a+,a+=b,a+b);couta,b,cendl;,1,2,64,2,6,输出,表达式中的类型转换,一、隐含转换,双目运算中操作数的类型转换;,是一种保值转换,转换类型由低到高;,转换规则:,二、强制转换,显式强制转换(通过强制转换运算符实现);,表达式中的类型转换(续),隐式强制转换:,在赋值表达式中,当左值(赋值运算符
40、左边的值)和右值(赋值运算符右边的值)的类型不同时,一律将右值类型强制转换为左值的类型;,在函数有返回值的调用中,将return后面的表达式的类型强制转换为该函数的类型;,2.8类型定义,1、格式,typedef;,例如:typedef double wages,bouns;wages weekly;bouns monthly;,2、自定义类型的作用,改善程序的可读性,增加所定义变量的信息,书写简练,提高程序的可移植性,第3章预处理和语句,3.1预处理功能3.2语句3.3选择语句3.4循环语句3.5转向语句,3.1预处理功能,一、预处理命令及预处理功能,1、预处理命令,C+源程序中包含的各种编
41、译命令在程序被正常编译之前执行;,预处理命令不是C+语言的一部分;,2、预处理功能,由预处理命令实现的功能;,二、常用的预处理命令,文件包含命令,宏定义命令,3.1预处理功能(续),以#为引导;,每条预处理命令单独占用一行,同一行不能有其他预处理命令和语句;,三、预处理命令使用说明,条件编译命令,停止编译命令,预处理命令的位置可以放在开头、中间和结尾;,预处理命令可以续行,续行符为;,预处理命令不是语句,不能以分号(;)结束;,文件包含命令,一、功能,指示C+编译器将一个文件(头文件)的内容 嵌入到该指令所在的文件中该指令所在位置处;,头文件指存放与标准函数有关的信息,或者存放符号常量、类型定
42、义、类和其他复杂类型的定义以及与程序环境相关信息的.h文件;,二、格式,#include,由系统提供并放在指定子目录中的头文件;,#include 文件名,由用户定义,放在当前目录或其他目录下的头文件或其他源文件;,文件包含命令(续),三、说明,文件包含命令一般放在程序头;,一条文件包含命令只能包含一个文件;,文件名:myfile.h#include myfile2.h#include myfile3.h,文件包含命令可以嵌套;,包含文件不易过多;,宏定义命令,一、功能,用来将一个标识符定义为一个字符串,该标识符称为宏名,被定义的字符串称为替换文本;,二、宏定义命令格式,1、两种定义格式,简单
43、宏定义,带参数的宏定义,2、简单宏定义,定义符号常量,例如:#define PI 3.1415,#define,宏定义命令(续),#define与const定义符号常量的区别,const产生一个具有类型的符号,#define仅产生文本替换,而不管内容是否正确,const double PI=3.1415;,#define PI 3.1415,使用const可以定义一个局部常量,可局部在一个函数体内,用#define定义的常量的作用域是从定义时开始,直到使用#undef取消定义时为止,如果不取消定义,直到整个文件结束,使用const定义常量是一个说明语句,用分号(;)结束,使用#define定义
44、常量是一个预处理命令,不能用分号(;)结束,宏定义命令(续),说明,书写#define命令时,与之间用空格分隔,不能使用等号连接;,使用#define定义的标识符不是变量,它只用作宏替换,不占用内存;,#define是一条预处理命令,不用分号结束,它所定义的标识符等价于其后的字符串;,标识符被宏定义后,在取消这次宏定义之前,不允许重新对它进行宏定义;,宏定义可以嵌套,已定义的标识符可以用来定义新的字符串;,宏定义命令(续),说明,应写在一行上,如果需要写在多行时,需使用续行符()结束,并在其后按下回车键;,与左括号之间不能出现空格,否则空格右边都将作为宏体;,定义带参数的宏体时,宏体中与参数名
45、相同的字符序列适当地加上括号,可以避免宏替换后出现的优先级问题;,C+中,带参数的宏定义常由内联函数取代;,3、带参数的宏定义,#define(),宏定义命令(续),例3.1:分析下列程序的输出结果。,#include void main()int b(5);#define b 2#define f(x)b*(x)int y(3);coutf(y+1)endl;#undef b coutf(y+1)endl;#define b(3)coutf(y+1)endl;,输出:82012,简单宏定义,带参数的宏定义,b=2,b=5,b=3,宏定义命令(续),4、替换正文中的操作符#与#,#:将它两边的
46、操作数连接成一个符号;,#:将它右边的操作数变成一个字符串文字;,例如:#define CON(a,b)a#bdouble i=CON(5,E-10)double i=5E-10;#define STR(a)#acoutSTR(Programming is fun!)endl;cout Programming is fun!endl;,5、取消宏定义命令,#undef,条件编译命令,一、功能,用来定义某些编译内容要在满足一定条件下才参与编译,否则不参与编译;可使同一源程序在不同的编译条件下产生不同的目标代码。,二、格式,格式一:#ifdef#else#end if或#ifdef#end if,
47、条件编译命令(续),格式二#ifndef#else#end if或#ifndef#end if,格式三#if#elif#elif.#else#end if,条件编译命令(续),例3.2:分析下列程序的输出结果。,#include#define A 10void main()#if A0 cout0endl;#elif A0 couta0endl;#else couta=0endl;#end if,输出:a0,条件编译命令(续),例3.3:避免重复引用某个头文件。,条件编译命令(续),例3.4:用于调试。,调试时:#define DEBUG 1.#if DEBUG=1 coutOKendl;#e
48、nd if.,调试后:#define DEBUG 0.,停止编译命令,一、格式,#error,二、功能,当编译器遇到该指令时,显示“字符序列”,即错误信息,然后停止对该程序的编译,从而可以在编译阶段发现程序中的错误;,三、示例,假设country值为:US、ENGLAND、CHINA程序中有如下语句:,停止编译命令(续),/#else#error You define country incorrectly#endif,当country的值不是上述三者之一时,编译器将显示:,然后停止编译。,You define country incorrectly,3.2语句,1、表达式语句和空语句,表达式
49、语句:任何一个表达式加上分号(;);,空语句:只有一个分号(;)的语句;,2、复合语句和分程序,复合语句:由两条或两条以上的程序构成,并由一对花括号括起;,分程序:又称块结构,含有一条或多条说明语句的复合语句;,条件语句,if()else if()else if().else if()else,说明:,if语句可以嵌套,在此情况下,else与最近的一个没有与else配对的if配对。,开关语句,switch()case:case:.case:default,注意:,在执行语句序列中如果遇到break语句,则退出switch语句,执行后面的语句;如果其后的语句序列中没有break语句,则一直执行至
50、switch语句结束。,开关语句(续),例3.5:分析下列程序的输出结果。,输出:4,5,3.4循环语句,1、while循环语句,while();,2、do-while循环语句,do while();,do-while循环与while循环的区别:,do-while循环至少执行一次循环体,while循环可能一次也不执行循环体;,3、for循环语句,for(d1;d2;d3);,4、多重循环,3.5转向语句,1、goto语句,格式:goto;,goto语句只能在一个函数内进行转向;,2、break语句,格式:break;,适用情况:,用于开关语句的语句序列中,其功能是退出开关语句,执行其后的语句;