版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象程序设计前言第1章C+语言概述第2章数据类型和表达式第3章预处理和语句第4章函数和作用域第5章类和对象(一)第6章类和对象(二)第7章继承性和派生类第8章多态性和虚函数第9章C+的I/O流库内容简介 面向对象的基本思想 C+语言的基本概念、基本语法和编程方法 C+语言的面向对象特征k类与对象k继承与派生k多态性与虚函数学习方法 多练习,掌握基本概念 多读程序,学习编程方法与技巧 多上机实践,加强动手能力 多剖析范例,积累编程经验教材及参考书目 C+语言基础教程吕凤翥著清华大学出版社1999 C+语言及其程序设计教程(修订版)张国峰编著电子工业出版社1997 C+语言程序设计郑莉等编著清
2、华大学出版社1999第1章C+语言概述 1.1C+的起源及特点 1.2面向对象的方法 1.3面向对象的程序设计语言C+ 1.4C+程序的编辑、编译和运行 1.5C+的词法及词法规则 1.6C+程序的结构1.1.1面向对象的由来和发展 机器语言(二进制码) 汇编语言 20世纪50年代中期,FORTRAN语言 20世纪50年代中期,Algol语言在计算机语言发展史上具有划时代的意义,引入了许多程序设计概念。如变量、数组、循环、分支等。提出块(BeginEnd)思想,对数据进行保护,是一种初级封装。1.1.1面向对象的由来和发展(续) 20世纪60年代中期,Simula 67语言面向对象语言的鼻祖,
3、提出了对象、类的概念,并支持类的继承。 20世纪70年代中期,Ada语言支持数据抽象类型的最重要的语言之一,但不完全支持继承。 20世纪70年代中期,Smalltalk语言最有影响的面向对象语言之一,丰富了面向对象的概念。 20世纪80年代中期后出现C+等多种面向对象语言1.1.2C+的起源和特点一、C+的起源 在C语言基础上为支持面向对象的程序设计研制的一个通用目的的程序设计语言; 由AT&T贝尔实验室Bjarne Stroustrup博士开发;二、C+的特点 与C兼容,既保持了C的简洁、高效和接近汇编的特点,又比C更安全,结构化程度更高; 既支持面向过程的程序设计,又支持面向对象的
4、程序设计;注意其两面性1.2面向对象的方法必须先研究事物,而后才能研究过程。必须先知道一个事物是什么,而后才能觉察这个事物中所发生的变化。路德维希费尔巴哈和德国古典文学的终结恩格斯1.2.1面向过程与面向对象程序设计例例1.1:输入任意短语或句子,计算该短语包含多少个字(word)和字符(character)。注意:输入短语时,必须在字和字之间只空一格。1.2.1面向过程与面向对象程序设计(续)面向过程的方法#include #include void main() char ch; int wdcount,chcount; wdcount=1; chcount=0; printf(*:Ple
5、ase input any phrasen); while(ch=getche()!=r) chcount+;1.2.1面向过程与面向对象程序设计(续) 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: 定义类公有成员1.2.1面向过程与面向对象程序设计(续) count(); void process(); void display();
6、private: int wdcount,chcount;count:count() wdcount=1; chcount=0;void count:process()私有成员构造函数成员函数数据成员1.2.1面向过程与面向对象程序设计(续) 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);1.2.1面向过
7、程与面向对象程序设计(续) printf(n*:The number of char is %dn,chcount);void main() count 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定义对象调用公有成员函数1.2.1面向过程与面向对象程序设计(续) 是一种数学思维或计算机思维方法,与人们认识世界的方法不同 以不稳定的、多变的“过程”和“操作” 为中心来构造系统 可重用性较差 是建立
8、在认识方法学基础上的一项技术科学,比较自然地模拟了人类认识客观世界的方式; 以相对稳定的“对象”和“数据结构”为中心来构造系统 可重用性较好面向过程程序设计面向对象程序设计1.2.1面向过程与面向对象程序设计(续)面向过程程序设计面向对象程序设计P1P2P3P4P5O1O2O3O4O5P61.2.1面向过程与面向对象程序设计(续)面向过程程序设计面向对象程序设计P1P2P3P5O1O2O3O4O5P6O41.2.2抽象在面向对象中的作用一、抽象的概念 抽象代表着一个对象的本质特征,这个特征将这个对象与所有其他种类的对象区别开来; 抽象是通过从特定的实例中抽取共同的性质以形成一般化的概念的过程;
9、 抽象具有层次;汽车轮船飞机交通工具1.2.2抽象在面向对象中的作用(续)二、面向对象抽象的原理(面向对象计算的本质)数据抽象、行为共享、进化、确定性1、数据抽象为程序员提供了一种对数据和为操作这些数据所需要的算法的抽象;是面向对象方法的核心,包括:模块化:构成了面向对象计算的本质;信息隐藏:将一个模块的细节部分对用户隐藏起来,用户只能通过一个受保护的接口来访问某个模块,而不能直接访问一个模块内部的细节;类公有成员1.2.2抽象在面向对象中的作用(续)2、行为共享 行为是由实体的外部接口定义的 行为共享指许多实体具有相同的接口,可增加系统的灵活性; 支持行为共享的方式k分类与层次分类k多态与继
10、承对象公有成员函数名1.2.2抽象在面向对象中的作用(续)3、进化需求进化(虚函数)进化式的问题求解(继承的构造函数)4、确定性 确保每个行为项都有一个正确的解释,系统不会因不能响应某一行为而失败; 确定性与类型的正确性有关;1.2.3面向对象计算的基本特征面向对象系统的三要素:对象、类和继承;一、对象1、概念上对象是代表着正在创建的系统中的一个实体;2、实现形式上对象是一个状态和操作(或方法)的封装体;3、对象的定义状态:对象的状态由这个对象的属性和这些属性的当前值决定。属性是静态的,当前值是动态的;一个对象具有状态、行为和标识。1.2.3面向对象计算的基本特征(续)行为:一个对象如何以状态
11、变化和消息传递的形式进行作用和对外界进行反应。一个对象的行为代表了这个对象的外部可见的和可测试的活动;一个对象的状态代表着它的行为的累积结果;标识:标识是一个对象固有的一种特性,该特性将这个对象与其他对象区别开来;属性1属性2.属性n值11值21.值n1值12值22.值n2对象1行为值11值21.值n1值12值22.值n2对象2行为1.2.3面向对象计算的基本特征(续)4、对象的分类实体对象界面对象控制对象按作用分类存储信息的对象支持系统的主要功能5、对象的确认 发明对象:主要是控制对象; 发现对象:主要是实体对象或界面对象;二、类1、什么是类1.2.3面向对象计算的基本特征(续)类是创建对象
12、的样板,它包含着所创建对象的状态描述和方法的定义。类的完整描述包含了外部接口和内部算法以及数据结构的形式;2、类是对象的抽象及描述类中包含生成对象的具体方法,由一个类所创建的对象称为该类的实例;3、类是抽象数据类型的实现类是所有对象的共同的行为和不同的状态的集合体;三、继承继承提供了创建新类的一种方法,它的本质特征是行为共享;属性属性1 1属性属性2 2属性属性n n行为行为1 1行为行为2 2行为行为m m值值1111值值2121值值n1n1值值1212值值2222值值n2n2行为行为1 1值值1111值值2121值值n1n1行为行为m m值值1212值值2222值值n2n2对象对象1 1对
13、象对象2 2对象对象k k对象对象p p类类类与对象的关系类与对象的关系1.2.3面向对象计算的基本特征(续)1.3.1C+语言中的抽象支持 控制抽象:用于排列任意动作的顺序的一种方法;三种语句控制结构:顺序、循环、分支 过程抽象(面向过程):对一组输入数据的一个计算动作和产生的输出结果; 数据抽象(面向对象):类是实现抽象数据类型的工具;1.3.2C+对面向对象程序设计方法的支持 C+支持数据封装(数据抽象)C+中,类是支持数据封装的工具,对象则是数据封装的实现; C+中包含有私有、公有和保护成员每个可能的消息对应一个相应的方法,方法通过函数来定义; C+中通过发送消息来处理对象 C+中允许
14、友元破坏封装性 C+中允许函数名和运算符重载 C+支持继承性 C+支持动态联编1.3.3C+对C语言的改进 增加了新的运算符::,new,delete等; 改进了类型系统,增加了安全性; 引进了引用概念; 允许函数重载,允许设置缺省参数,提高了编程的灵活性; 引进了内联函数,提高了程序的效率; 可以根据需要随时对变量进行说明;1.4C+程序的编辑、编译和运行一、编辑:源文件的扩展名为.cpp二、编译1、预处理过程词法分析:单词语法分析:构造程序的格式符号表:程序中的各种符号及其属性错误处理程序:生成目标代码:目标文件扩展名.obj2、编译 过程3、连接过程:可执行文件扩展名.exe三、运行1.
15、4C+程序的编辑、编译和运行(续)源程序.cpp目标文件.obj可执行文件.exe编译器连接器磁盘中的#include文件C+库文件.LIB1.5.1C+的字符集大小写的英文字母:az,AZ 数字字符:09 特殊字符空格!#%&*_+=-/,“;.,()1.5.2词法记号1、关键字(保留字)表1-1C+的关键字autoboolbreakcasecatchcharclassconstconst_cast continue defaultdeletedodoubledynamic_cast else enumexplicitexternfalsefloatforfriendgotoifin
16、lineintlongmutablenewoperator privateprotected publicregisterreinterpret_castreturnshortsignedsizeofstaticstatic_cast structswitchtemplate thisthrowtruetrytypedef typeidtypename unionunsigned virtualvoidvolatile while1.5.2词法记号(续)2、标识符组成规则:以字母或下划线开始,其后跟零个或多个字母、数字或下划线;不能以数字开始正确标识符:Result, DoubleList,_
17、first, first_错误标识符:1first标识符的长度任意(受编译器限制);区分字母的大小写;不能使用系统的保留字;例如:ADD, Add, add1.5.2词法记号(续)3、运算符单目双目三目运算符5、分隔符(),分隔符:4、各种文字数字字符文字串文字文字布尔文字;1.5.3空白一、空白包括:空格、制表符、换行符、注释功能:指示词法记号的开始和结束位置;二、注释 /*/ /1.6C+程序的结构一、C+示范程序#include void main() coutHello world! endl;二、C+程序的组成 预处理命令 输入输出 函数 语句 变量 其他I/O流库,提供所有的输入输
18、出操作cout:流类对象:提取符例如:cinPlease inputtwo integers:;cinab;endl:换行;第2章数据类型和表达式 2.1基本数据类型 2.2常量和变量 2.3数组类型 2.4枚举类型 2.5指针和引用 2.6运算符 2.7表达式 2.8类型定义2.1基本数据类型一、基本数据类型整型int浮点型(实型)字符型char基本数据类型逻辑型bool空值型void单精度浮点数float双精度浮点数double用于函数和指针2.1基本数据类型(续)二、数据类型修饰符signed:有符号unsigned:无符号short:短型long:长型说明:3) long修饰符还适用于
19、双精度浮点数;2) 上述修饰符均可用于整型和字符型;1) 类型修饰符可以修饰除void、bool类型以外的其他类型;2.1基本数据类型(续)三、基本数据类型列表表2-1C+的基本数据类型类类型型名名字字宽宽(字字节节)范范围围boolfalse, truechar1-128127signed char1-128127unsigned char10255short int2-3276832767signed short int2-3276832767unsigned short int2065535int4-21474836482147483647signed int4-214748364821
20、47483647unsigned int404294967295long int4-21474836482147483647signed long int4-21474836482147483647unsigned long int404294967295float43.4E 10-383.4E 1038double81.7E 10-3081.7E 10308long double103.4E 10-49323.4E 1049322.1基本数据类型(续)说明:1) 表中的int可以省略,即在int之前有修饰符出现时,可以省略关键字int;2) 单精度类型float、双精度类型double、长精
21、度类型long double统称浮点类型;3) char类型和各种int类型统称整型类型;char类型变量在内存中以它的ASCII码值的形式存储;4) 字宽(字节)取决于操作系统和编译器的实现,可用sizeof验证;2.2.1常量一、整型常量(无小数部分)1、表示方法 十进制 八进制 十六进制2、十进制表示 由09的数字组成 不能以0开始 无前缀 例:132, -3453、八进制表示 由0 7的数字组成 以0为前缀 例:010, -05364、十六进制表示 由09的数字及A F的字母(大小写均可)组成 以0 x或0X为前缀 例:0 x7A, -0X3de2.2.1常量(续)5、说明:1) 长整
22、型用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十进制时无2.2.1常量(续)二、浮点型常量 由整数部分和小数部分构成; 只有十进制表示; 一般表示形式(小数表示形式):k整数部分与小数部分可以省去一部分,但不能全部省去;k例如:5.,.25,4.072.2.
23、1常量(续) 科学表示形式:k在小数表示法后面加E(或e)表示指数;k例如:23.5E6,.032E-5,.3e10k指数部分可正可负,但必须为整数; 浮点常量的缺省数据类型为double型; 后缀F(或f)表示float类型; 后缀l(或l)表示long double类型;2.2.1常量(续)三、字符常量 由一对单引号括起的一个字符表示; 其值为所括起字符在ASCII表中的编码; 所括起字符的表示方法:k图形表示法该方法适用于有图形符号的可打印字符;例如:A,a,*k转义序列表示法该方法适用于所有字符,尤其是无图形符号的不可打印字符;2.2.1常量(续)K转义序列表示方法:以反斜线()开头,
24、后跟字符的ASCII码值;K八进制表示:ddd;例如:101K十六进制表示:xhh;例如:x41表2-2C+中常用转义序列符符号含义a响铃n换行符r回车符t水平制表符(tab 键)b退格符(backspace 键)反斜线单引号双引号0空字符2.2.1常量(续)四、布尔常量有两个值:true和false;五、字符串常量(串常量,字符串) 一对双引号括起的字符序列,字符序列可以包含空格、转义序列或任何其他字符,这些字符不一定是C+字符集中的字符,只要C+编译器支持即可;例如:This is a string; 串常量与字符常量的区别:2.2.1常量(续) 由一个字符型变量存放 由一维数组存放字符常
25、量串常量 用单引号括起 用双引号括起 字符串有一个结束符,该结束符用0表示 字符常量a在内存中占用一个字节 字符串常量a在内存中占用两个字节 可进行加、减法运算 可进行连接、拷贝运算2.2.1常量(续)六、符号常量 用来表示C+中的常量,即用一个与常量相关的标识符来替代常量; 优点:增加可读性,增强可维护性;例如:PI表示3.1415926 定义方法:使用类型说明符const;例如:const int size=80; 定义的符号常量必须初始化; 一个符号常量可看作是一个只读变量,由const定义的常量的值不可以改变;Line1:#include Line2:const double pi=3
26、.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:2.2.1常量(续)const double r=3.2;错误错误错误,不能修改错误,不能修改pi的值的值地址值2.2.2变量一、变量的三个基本要素名字类型值三要素数据值地址值int c;c=5;内存5.c地址值1000H变量类型变量名数据值二、变
27、量的定义 可以在程序中随时定义变量,只要在该变量被使用前定义即可; 定义格式:;例如:int a,b,c;double x,y,z;2.2.2变量(续) 同一程序块内不可以定义同名变量; 初始值k变量定义时可赋初始值;k声明格式:数据类型 标识符1(初始值1), ,标识符n(初始值n);数据类型 标识符1=初始值1, ,标识符n=初始值n;k例如:double price=15.5;int size=100;k未被初始化的变量的值或者是默认值,或者是无效值,由变量类型决定; 变量可被赋值,由变量名标识;2.3数组类型数目固定、类型相同的若干个变量的有序集合;2.3.1数组的定义1、格式 ;说明
28、: 方括号( )表示数组的维; 某维的大小必须是大于1的常量表达式;2、示例 int a3; char b35; const int size=80; int msize;2.3.2数组的赋值1、数组元素的表示 下标表示:;说明:k为常量表达式;k下标从0开始;k各个元素在内存中按其下标的升序顺序连续存放; 指针表示:2.3.2数组的赋值(续)2、数组元素赋初值 利用初始值表(由一对花括号括起来的若干数据项组成)实现; 数组元素的个数要大于等于初始值表中数据项的个数; 例如:int a5=1,2,3,4,5;int a4=5,4;int b23=1,2,3,4,5,6;int b23=1,2,
29、3,4,5,6;int c232=5,4,3,2,1,0;3、数组元素的赋值例如:int m3;m0=5;m1=3;m2=1;2.3.3字符数组说明: 字符数组是指数组元素是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枚举类型枚举类型是若干个有名字的整型常量的集合;2.4.1枚举声明和枚举变量一、枚举声明 enum ; 由若干个枚举符组成,多个枚举符之间用
30、逗号分隔; 枚举符是用标识符表示的整型常量,又称枚举常量; 枚举常量的值默认为最前边的一个为0,其后的值依次加1; 枚举常量的值也可显式定义,未显式定义的则在前一个值的基础上加1;2.4.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,d
31、3;2.4.2枚举变量的值 其值是该枚举变量所属的枚举声明的枚举表的某一个枚举符; 利用枚举符所表示的整型值给枚举变量赋值时,需要进行类型强制; 例如:d1=Sun;d2=Sat;d3=(enum day)4;2.5.1指针1、什么是指针 指针是用来存放某个变量的地址值的一种变量; 指针的类型是它所指向变量的类型; 指针本身数据值的类型是unsigned long int型; 例如:int a(5);int *p=&a;内存1000H5.a地址值1000H3000Hp2.5.1指针(续)2、如何定义指针 例如:int *pi;char (*pa)3;float *pl; int (*p
32、f)();char *pc; int *pp; *, *,;3、指针的赋值(内存地址值) 指针必须被赋值后才可使用; 一般变量、数组元素、结构成员的地址值为变量名前加运算符&; 数组的地址值用该数组名表示;2.5.1指针(续) 函数的地址值用该函数的名字表示; 例如:int a,b10;double sin(double x);int *p=&a,*p=&b3; double (*pf)();int a10,*p=a; pf=sin;3、指针的运算 赋值运算。例如:int a,*p=&a,*q;q=p; 一个指针可以加上或减去一个整数值; 在一定条件下(指向同一
33、数组的不同元素),两个指针可以相减; 在一定条件下(指向同一数组元素),两个指针可以比较;a与&a0相同2.5.2指针和数组1、C+中指针与数组的关系 C+通过指针访问数组中的每个元素; 数组不能参与表达式求值。在运算表达式中,一个标识数组对象的操作数在运算表达式中被自动转换为一个指向数组对象的第一个元素对象的指针值。2、一维数组的指针表示法 C+中规定:任何一个数组的名字是一个常量指针,其值是该数组的首元素的地址值; 例如:int a5;数组表示法:ai,i=0,1,2,3,4指针表示法:*(a+i)2.5.2指针和数组(续)3、二维数组的指针表示法 int b25; 数组表示法:b
34、iji=0,1; j=0,1,2,3,4 指针表示法:*(*(b+i)+j)*(bi+j)(*(b+i)j(&b00+5*i+j)4、三维数组的指针表示法(同二维)5、示例2.5.2指针和数组(续)例2.1:分析下列程序的输出结果。#include void main() static int a5=5,4,3,2,1; int i,j; i=a0+a4; j=*(a+2)+*(a+4); coutiendljendl;输出644a15a03a22a31a4aa+2a+42.5.2指针和数组(续)例2.2:分析下列程序的输出结果。#include void main() static
35、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 mnpqnpdeace99a的ASCII码值为0 x61,即972.5.2指针和数组(续)例2.3:分析下列程序的输出结果。#include void main() static char t35=abcd, efgh, ijkl, mnop, qrst, uvwx; coutt123*(t12+3)*(*(*(t+1)+2)+3) *(*(
36、t1+2)+3)endl; cout*tt*(*(t+1)+1)tt02 t*t+1endl;输出xxxxabcdqrstijklbcd2.5.3引用 标识对象的一种机制; 对对象存储地址的抽象,但引用不是值; 引用有类型; 变量的别名;1、定义格式 &();或 &=;2、初始化与赋值 定义引用时必须初始化; 可以将一个引用赋给某个变量; 引用可被赋值;2.5.3引用(续)示例:int a=3;int &m=a;int n=m;int *p=&m;m=m+5;3a8pm3n定义引用并初始化将引用赋值给变量a=8,对引用的操作就是对被引用者的操作3、引用的功能 用
37、做函数的参数或函数的返回值; 函数不能返回对局部对象的引用;2.5.3引用(续)示例:int& f(int index,int a) int r=aindex; return r;错,r是局部对象4、指针与引用的区别 指针通过地址间接访问某个变量,引用通过别名直接访问某个变量; 引用必须初始化,一旦被初始化后不得再作为其他变量的别名;正确:int &r=aindex;2.5.3引用(续)例2.4:分析下列程序的输出结果。#include void main() int val(5); int &refv=val; refv=refv+5; coutvalendl; in
38、t *p=&refv,val1(refv); cout*ptval1endl;输出1010102.5.3引用(续)例2.5:分析下列程序的输出结果。#include int& f(int index,int a) int &r=aindex; return r;void main() int a=1,3,5,7,9; f(2,a)=55; for(i=0;i5;i+) coutai、=、=、=、!= 前四种优先级高于后两种;2.6.3逻辑运算符 双目运算符:&、| 优先级:&、|、! 单目运算符:!2.6.4位操作运算符1、逻辑位运算符 单目逻辑位运算符
39、: 双目逻辑位运算符:&、|、 双目逻辑位运算符的优先级:&、|、;2、移位运算符 双目运算符:; 时移掉的位被丢弃,左边移出的空位补0或符号位;2.6.5赋值运算符 简单赋值运算符:= 复合赋值运算符:+=、-=、*=、/=、%=、&=、|=、=、=2.6.6其他运算符1、三目运算符 格式:d1?d2:d3 功能:先计算d1,若其非零,表达式的值为d2的值,否则为d3的值; 表达式类型:d2和d3中类型较高者的类型;2、逗号运算符 格式:d1,d2,dn 表达式的值和类型:由最后一个表达式确定; 优先级在所有运算符中最低;3、sizeof运算符2.6.6其他运算符(续
40、) 格式: 功能:返回其后的类型说明符或表达式所表示的数在内存中所占的字节;4、单目运算符&和* &:取地址; *:用在指针名前,表示取指针的内容;5、强制类型运算符sizeof();或sizeof(); 格式: ();或 () ;2.6.6其他运算符(续) 强制类型转换可将高类型转换为低类型,是一种不安全的转换;示例:double f(3.85);int h;h=int(f); 该转换是暂时的,一次性的;示例:int a(3),m;double b;b=3.56+double(a);m=a+5;2.6.7运算符和优先级和结合性 P46,表表达式的种类 由运算符
41、和操作数组成的式子; 常见的表达式k算术表达式;k逻辑表达式;k关系表达式;k赋值表达式;k条件表达式;k逗号表达式;2.7.1表达式的种类(续) 注意事项:k连续的两个运算符之间用空格分隔;k可用括号来改变运算符优先级;k双目运算符的左右可以用空格符和操作数分开;k过长的表达式可分成几个表达式;2.7.2表达式的值和类型一、确定表达式的值二、表达式求值方法与确定类型的方法 先确定运算符的功能; 确定计算顺序:先考虑优先级,再考虑结合性;2.7.2表达式的值和类型(续)例2.6:分析下列程序的输出结果(算术表达式)。#include void main() unsigned a(0 xab),
42、b(20); a&=b; a=a; coutatby; x=y; x|=yy; y&=x+1; coutxtyendl;输出:020-1 12.7.2表达式的值和类型(续)例2.7:分析下列程序的输出结果(关系表达式)。#include void main() char x(m),y(n); int n; n=xy; coutnendl; n=x=y-1; coutn3)+(y-x=1); coutnendl; 输出:1132.7.2表达式的值和类型(续)例2.8:分析下列程序的输出结果(逻辑表达式)。#include void main() int x,y,z; x=y=z=
43、1; -x&+y&+z; coutxtytzendl; +x&+y&+z; coutxtytzendl; +x&y-|+z; coutxtytzendl; 输出:011122212注意逻辑表达式的求值方法2.7.2表达式的值和类型(续)例2.9:分析下列程序的输出结果(条件表达式)。#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.7.2表达式的值和类型(续)
44、例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, y“, zendl; 输出:10,9,3-10,-1,-74,6,122.7.2表达式的值和类型(续)例2.11:分析下列程序的输出结果(逗号表达式)。#include void main() int a,b,c; a=1,b=2,c=a+b+3; couta, b, cendl;
45、 c=(a+,a+=b,a+b); couta, b, cendl;1,2,64,2,6输出2.7.3表达式中的类型转换一、隐含转换 双目运算中操作数的类型转换; 是一种保值转换,转换类型由低到高; 转换规则:int unsigned long unsigned long doubleshort,charfloat二、强制转换 显式强制转换(通过强制转换运算符实现);2.7.3表达式中的类型转换(续) 隐式强制转换:k在赋值表达式中,当左值(赋值运算符左边的值)和右值(赋值运算符右边的值) 的类型不同时,一律将右值类型强制转换为左值的类型;k在函数有返回值的调用中,将return后面的表达式的
46、类型强制转换为该函数的类型;显式隐式赋值表达式函数返回值隐含转换强制转换类型转换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+源程序中包含的各种编译命令在程序被正常编译之前执行; 预处理命令不是C+语言的一部分;2、预处理功能 由预处理命令实
47、现的功能;二、常用的预处理命令 文件包含命令 宏定义命令3.1预处理功能(续) 以 # 为引导; 每条预处理命令单独占用一行,同一行不能有其他预处理命令和语句;三、预处理命令使用说明 条件编译命令 停止编译命令 预处理命令的位置可以放在开头、中间和结尾; 预处理命令可以续行,续行符为 ; 预处理命令不是语句,不能以分号(;)结束;3.1.1文件包含命令一、功能 指示C+编译器将一个文件(头文件)的内容 嵌入到该指令所在的文件中该指令所在位置处; 头文件指存放与标准函数有关的信息,或者存放符号常量、类型定义、类和其他复杂类型的定义以及与程序环境相关信息的.h文件;二、格式#include 由系统
48、提供并放在指定子目录中的头文件;#include 文件名由用户定义,放在当前目录或其他目录下的头文件或其他源文件;3.1.1文件包含命令(续)三、说明 文件包含命令一般放在程序头; 一条文件包含命令只能包含一个文件;文件名:myfile.h#include myfile2.h#include myfile3.h 文件包含命令可以嵌套; 包含文件不易过多;3.1.2宏定义命令一、功能用来将一个标识符定义为一个字符串,该标识符称为宏名,被定义的字符串称为替换文本;二、宏定义命令格式1、两种定义格式 简单宏定义 带参数的宏定义2、简单宏定义定义符号常量,例如:#define PI 3.1415#de
49、fine 3.1.2宏定义命令(续) #define与const定义符号常量的区别 const产生一个具有类型的符号 #define仅产生文本替换,而不管内容是否正确const double PI=3.1415;#define PI 3.1415 使用const可以定义一个局部常量,可局部在一个函数体内 用#define定义的常量的作用域是从定义时开始,直到使用#undef取消定义时为止,如果不取消定义,直到整个文件结束 使用const定义常量是一个说明语句,用分号(;)结束 使用#define定义常量是一个预处理命令,不能用分号(;)结束3.1.2宏定义命令(续) 说明k书写#define命
50、令时,与之间用空格分隔,不能使用等号连接;k使用#define定义的标识符不是变量,它只用作宏替换,不占用内存;k#define是一条预处理命令,不用分号结束,它所定义的标识符等价于其后的字符串;k标识符被宏定义后,在取消这次宏定义之前,不允许重新对它进行宏定义;k宏定义可以嵌套,已定义的标识符可以用来定义新的字符串;3.1.2宏定义命令(续) 说明k应写在一行上,如果需要写在多行时,需使用续行符()结束,并在其后按下回车键;k与左括号之间不能出现空格,否则空格右边都将作为宏体;k定义带参数的宏体时,宏体中与参数名相同的字符序列适当地加上括号,可以避免宏替换后出现的优先级问题;kC+中,带参数
51、的宏定义常由内联函数取代;3、带参数的宏定义#define () 3.1.2宏定义命令(续)例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=2b=5b=33.1.2宏定义命令(续)4、替换正文中的操作符#与# #:将它两边的操作数连接成一个符号; #:将它右边的操作数变成一个字符串文字;
52、例如:#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 3.1.3条件编译命令一、功能用来定义某些编译内容要在满足一定条件下才参与编译,否则不参与编译;可使同一源程序在不同的编译条件下产生不同的目标代码。二、格式格式一:#ifdef #else#end if或#ifdef #end if3.1.3条件编译命令(续)格式二#ifndef #else
53、#end if或#ifndef #end if格式三#if #elif #elif .#else#end if3.1.3条件编译命令(续)例3.2:分析下列程序的输出结果。#include #define A 10void main() #if A0 cout0endl; #elif A0 couta0endl; #else couta=003.1.3条件编译命令(续)例3.3:避免重复引用某个头文件。/main.cpp#include myfile1.h#include myfile2.h/myfile1.h#include myhead.h/myfile2.h#include myhead
54、.h改进: /myfile1.h #ifndef MYHEAD_H #define MYHEAD_H #include myhead.h#endif/myfile2.h #ifndef MYHEAD_H #define MYHEAD_H #include myhead.h#endif 3.1.3条件编译命令(续)例3.4:用于调试。调试时:#define DEBUG 1.#if DEBUG=1 coutOKendl;#end if.调试后:#define DEBUG 停止编译命令一、格式#error 二、功能当编译器遇到该指令时,显示“字符序列”,即错误信息,然后停止对该程序的编
55、译,从而可以在编译阶段发现程序中的错误;三、示例假设country值为:US、ENGLAND、CHINA程序中有如下语句:3.1.4停止编译命令(续)/#else #error You define country incorrectly#endif当country的值不是上述三者之一时,编译器将显示:然后停止编译。You define country incorrectly3.2语句1、表达式语句和空语句 表达式语句:任何一个表达式加上分号(;); 空语句:只有一个分号(;)的语句;2、复合语句和分程序 复合语句:由两条或两条以上的程序构成,并由一对花括号括起; 分程序:又称块结构,含有一条
56、或多条说明语句的复合语句;3.3.1条件语句if () else if () else if () .else if () else 说明:if语句可以嵌套,在此情况下,else与最近的一个没有与else配对的if配对。3.3.2开关语句switch ()case :case :.case :default 注意:在执行语句序列中如果遇到break语句,则退出switch语句,执行后面的语句;如果其后的语句序列中没有break语句,则一直执行至switch语句结束。3.3.2开关语句(续)例3.5:分析下列程序的输出结果。#include void main() int i(1),j(0),m
57、(1),n(2); switch(i+) case 1:m+; n+; case 2:switch(+j) case 1:m+; case 2:n+; case 3:m+; n+; break; case 4:m+;n+; coutm, nendl; 输出:4,53.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语句 格式:got
58、o ; goto语句只能在一个函数内进行转向;2、break语句 格式:break; 适用情况:k用于开关语句的语句序列中,其功能是退出开关语句,执行其后的语句;k用于循环体中,其功能是用来退出该重循环;3、continue语句 格式:continue; 功能:在循环体中用来结束本次循环;第4章函数和作用域 4.1函数的基本概念 4.2函数的定义和说明 4.3函数的调用 4.4函数的参数 4.5内联函数 4.6函数重载 4.7异常处理基础 4.8作用域返回类型为void类型的函数抽象为过程抽象4.1函数的基本概念 函数结构:由花括号括起来的一个语句序列; 函数抽象:使用标识符对语句序列进行的抽
59、象; 函数调用:函数级上的控制抽象,一种控制转移; 参数化:在函数抽象中对其所操作的值进行抽象的过程; 形参与实参 函数抽象与过程抽象k函数抽象的目的是进行求值k过程抽象的目的是更新对象 C+中只有函数抽象4.2.1函数的定义格式 ()说明:为函数返回值类型,若为void,则为过程调用;中的参数为形参,在函数被调用时进行初始化,从而从被调用处获得数据;函数体4.2.2函数的说明方法(函数的声明)一、函数的说明原则 如果一个函数定义在先,调用在后,调用前可以不必说明; 如果一个函数定义在后,调用在先,调用前必须说明;二、函数的说明方法(原型说明) ();三、示例参数表中的参数名称可以省略4.2.
60、2函数的说明方法(续)#include void fun1(),fun2(),fun3();void main() coutIt is in main. endl; fun2(); coutIt is back in main. endl;void fun1() coutIt is in fun1. endl; fun3(); coutIt is back in fun1. endl;例4.1:分析下列程序的输出结果。函数原型声明4.2.2函数的说明方法(续)void fun2() coutIt is in fun2. endl; fun1(); coutIt is back in fun2. endl;void fun3() coutIt is in fun3. endl;It is in main.It is back in fun1.It is in fun2. It is back in fun2.It is in fun1. It is back
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 安全检查服务合同范本
- 冀少版八年级生物上册第三单元第三节无机盐与植物的生长课件
- 学前教育进入“有专门法可依”新阶段
- 部编本二年级上册语文第四至七单元(内容含课文口语交际及语文园地)全部教案
- 七年级下册古诗文预习《爱莲说》-2022-2023学年七年级语文古诗文寒假复习预习课
- 消防安全群防群治实施细则
- 人教版新课标小学数学四年级下册教案
- 医疗行业专业劳务派遣方案
- 石油勘探设备校正操作规程
- 电力工程投标诚信承诺书模板
- 大作业计算机网络
- 鲁班尺各标准吉凶数对照表
- 西南油气田对外合作项目基于PSC谈判经济评价
- 基于PLC的药片自动装瓶控制系统设计
- 微生物限度方法学验证
- 迁入街道公共集体户承诺书
- 湖北农业发展的现状与问题分析
- 镇江市内河航道网规划
- 阻尼比的计算精品课件
- 废气管道方案
- 方木、模板、钢管用量的计算参考
评论
0/150
提交评论