面向对象程序设计(谭浩强版)_第1页
面向对象程序设计(谭浩强版)_第2页
面向对象程序设计(谭浩强版)_第3页
面向对象程序设计(谭浩强版)_第4页
面向对象程序设计(谭浩强版)_第5页
已阅读5页,还剩494页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 面向对象程序设计 第1章C+的初步知识 第2章类和对象 第3章关于类和对象的进一步讨论 第4章运算符重载 第5章继承与派生 第6章多态性与虚函数 第7章输入输出流 第8章工具 内容简介 面向对象的基本思想 C+语言的基本概念、基本语法和编程方法 C+语言的面向对象特征 k类与对象 k继承与派生 k多态性与虚函数 学习方法 多练习,掌握基本概念 多读程序,学习编程方法与技巧 多上机实践,加强动手能力 多剖析范例,积累编程经验 教材及参考书目 C+语言基础教程吕凤翥著清华大学出版 社1999 C+语言及其程序设计教程(修订版)张国 峰编著电子工业出版社1997 C+语言程序设计郑莉等编著清华大学

2、出 版社1999 Visual C+程序设计王育坚编著清华大学 出版社 第1章C+初步知识 1.1从到 1.2最简单的程序 1.3C+对的扩充 1.4程序的编写和实现 1.5关于上要实践 1.6C+程序的结构 1.1从到 机器语言(二进制码) 汇编语言 20世纪50年代中期,FORTRAN语言 20世纪50年代中期,Algol语言 在计算机语言发展史上具有划时代的意义, 引入了许多程序设计概念。如变量、数组、循环、 分支等。 提出块(BeginEnd)思想,对数据进行保护, 是一种初级封装。 20世纪60年代中期,Simula 67语言 面向对象语言的鼻祖,提出了对象、类的概 念,并支持类的继

3、承。 20世纪70年代中期,Ada语言 支持数据抽象类型的最重要的语言之一,但 不完全支持继承。 20世纪70年代中期,Smalltalk语言 最有影响的面向对象语言之一,丰富了面向 对象的概念。 20世纪80年代中期后出现C+等多种面向对象语言 1.1从到 C语言的主要特点是:语言的主要特点是: 1、C语言是一种结构化的程序设计语言,语言是一种结构化的程序设计语言,语言本语言本 身简洁、使用灵活方便身简洁、使用灵活方便。既适用于设计和编写大。既适用于设计和编写大 的系统程序,又适用于编写小的控制程序,也适的系统程序,又适用于编写小的控制程序,也适 用科学计算。用科学计算。 2、它既有高级语言

4、的特点,又具有汇编语言的特它既有高级语言的特点,又具有汇编语言的特 点。点。运算符丰富,除了提供对数据的算术逻辑运算运算符丰富,除了提供对数据的算术逻辑运算 外,还提供了二进制的位运算。并且也提供了灵活外,还提供了二进制的位运算。并且也提供了灵活 的数据结构。用的数据结构。用C语言编写的程序表述灵活方便,语言编写的程序表述灵活方便, 功能强大。用功能强大。用C语言开发的程序,其结构性好,目语言开发的程序,其结构性好,目 标程序质量高,程序执行效率高。标程序质量高,程序执行效率高。 3、程序的可移植性好程序的可移植性好。用。用C语言在某一种型号的计语言在某一种型号的计 算机上开发的程序,基本上可

5、以不作修改,而直接算机上开发的程序,基本上可以不作修改,而直接 移植到其它型号和不同档次的计算机上运行。移植到其它型号和不同档次的计算机上运行。 4、程序的语法结构不够严密,程序设计的自由度程序的语法结构不够严密,程序设计的自由度 大大。这对于比较精通。这对于比较精通C语言的程序设计者来说,可语言的程序设计者来说,可 以设计出高质量的非常通用的程序。但对于初学者以设计出高质量的非常通用的程序。但对于初学者 来说,要能比较熟练运用来说,要能比较熟练运用C语言来编写程序,并不语言来编写程序,并不 是一件容易的事情。与其它高级语言相比而言,调是一件容易的事情。与其它高级语言相比而言,调 试程序比较困

6、难。往往是编好程序输入计算机后,试程序比较困难。往往是编好程序输入计算机后, 编译时容易通过,而在执行时还会出错。但只要对编译时容易通过,而在执行时还会出错。但只要对 C语言的语法规则真正领会,编写程序及调试程序语言的语法规则真正领会,编写程序及调试程序 还是比较容易掌握的。还是比较容易掌握的。 随着随着C语言应用的推广,语言应用的推广,C语言存在的一语言存在的一 些缺陷或不足也开始流露出来,并受到大些缺陷或不足也开始流露出来,并受到大 家的关注。如:家的关注。如:C语言对数据类型检查的语言对数据类型检查的 机制比较弱;缺少支持代码重用的结构;机制比较弱;缺少支持代码重用的结构; 随着软件工程

7、规模的扩大,难以适应开发随着软件工程规模的扩大,难以适应开发 特大型的程度等等。特大型的程度等等。 为了克服为了克服C语言本身存在的缺点,并保持语言本身存在的缺点,并保持C语言简语言简 洁、高效,与汇编语言接近的特点,洁、高效,与汇编语言接近的特点,1980年,贝年,贝 尔实验室的尔实验室的Bjarne Stroustrup博士及其同事对博士及其同事对C语语 言进行了改进和扩充,并把言进行了改进和扩充,并把Simula 67中类的概念中类的概念 引入到引入到C中。并在中。并在1983年由年由Rick Maseitti提议正式提议正式 命名为命名为C+(C Plus Plus)。后来,)。后来,

8、又把运算符的又把运算符的 重载、引用、虚函数等功能加入到重载、引用、虚函数等功能加入到C+中,使中,使C+ 的功能日趋完善。的功能日趋完善。 当前用得较为广泛的当前用得较为广泛的C+有:有:VC+ (Visual C Plus Plus)、)、 BC+(Borland C Plus Plus)、)、 AT/使用命名空间std(276) int main() coutThis is a C+ Program.n;/用cout的方法 输出一行 return 0; 1.2最简单的C+程序 分析: (1)main前的int ;return 0;表示正常返回 (2)/*/ 多行注释,不能嵌套定义 (3)

9、cout(c、out),输出对流类的一个对象 (4)头文件,i-o-stream,输入输出流类 (5)using namespace std ;命名空间std,表示要用到 命名空间std的内容。(273页) 1.2最简单的C+程序 cout:输出 (1)coutab; (2)couta,b,c; (3)续行符“” (4)cout“hellon”;/原样输出字符串 (5)cout“a=”aendl; 错错 换行换行 1.2最简单的C+程序 例例1.2:求:求a和和b两个数之和。两个数之和。 #include /用cout输出时需要用此头文件 using namespace std;/使用命名空间

10、std int main() /函数体开始 int a,b,sum; /定义变量 cinab; /输入语句 sum=a+b;/赋值语句 couta+b=sumendl;/输出语句 return 0; /如程序正常结束,向操作系统返回一个零值 参考页 1.2最简单的C+程序 #include using namespace std; int main() int max(int x,int y); int a,b,c; cinab; c=max(a,b);/函数调用函数调用 coutmax=cy) z=x; else z=y; return(z); 函数声明 1.2最简单的C+程序 例例1.4:

11、输入任意短语或句子,计算该短语包含多 少个字(word)和字符(character)。 注意:输入短语时,必须在字和字之间只空一格。 面向过程的方法 #include #include void main() char ch; int wdcount,chcount; wdcount=1; chcount=0; printf(*:Please input any phrasen); while(ch=getche()!=r) chcount+; 1.2最简单的C+程序 if(ch= ) wdcount+; printf(n*:The number of word is %dn,wdcount)

12、; printf(n*:The number of char is %dn,chcount); 面向对象的方法 #include #include class count public: 定义类 公有成员 1.2最简单的C+程序(续) count(); void process(); void display(); private: int wdcount,chcount; ; count:count() wdcount=1; chcount=0; void count:process() 私有成员 构造函数 成员函数 数据成员 1.2最简单的C+程序 char ch; cout*:Pleas

13、e 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最简单的C+程序(续) printf(n*:The number of char is %dn,chcount); void main() count A; A.process(); A.display(); 运 行 结 果 *Please input any phrase. I am a

14、 teacher *:The number of word is 4 *:The number of char is 15 定义对象 调用公有成员函数 1.2最简单的C+程序(续) 一、面向过程与面向对象程序设计 是一种数学思维或计 算机思维方法,与人 们认识世界的方法不 同 以不稳定的、多变的 “过程”和“操作” 为中心来构造系统 可重用性较差 是建立在认识方法学 基础上的一项技术科 学,比较自然地模拟 了人类认识客观世界 的方式; 以相对稳定的“对象” 和“数据结构”为中 心来构造系统 可重用性较好 面向过程程序设计面向对象程序设计 一、面向过程与面向对象程序设计 面向过程程序设计面向对象

15、程序设计 P1 P2 P3 P4 P5 O1 O2 O3 O4 O5 P6 一、面向过程与面向对象程序设计 面向过程程序设计面向对象程序设计 P1 P2 P3 P5 O1 O2 O3 O4 O5 P6 O4 二、抽象在面向对象中的作用 、抽象的概念 抽象代表着一个对象的本质特征,这个特征将 这个对象与所有其他种类的对象区别开来; 抽象是通过从特定的实例中抽取共同的性质以 形成一般化的概念的过程; 抽象具有层次; 汽车轮船飞机 交通工具 二、抽象在面向对象中的作用(续) 、面向对象抽象的原理(面向对象计算的本质) 数据抽象、行为共享、进化、确定性 1、数据抽象 为程序员提供了一种对数据和为操作这

16、些数据 所需要的算法的抽象;是面向对象方法的核心,包 括: 模块化:构成了面向对象计算的本质; 信息隐藏:将一个模块的细节部分对用户隐藏起 来,用户只能通过一个受保护的接口来访问某个 模块,而不能直接访问一个模块内部的细节; 类 公有成员 二、抽象在面向对象中的作用(续) 2、行为共享 行为是由实体的外部接口定义的 行为共享指许多实体具有相同的接口,可增加 系统的灵活性; 支持行为共享的方式 k分类与层次分类 k多态与继承 对象公有成员函数名 二、抽象在面向对象中的作用(续) 3、进化 需求进化(虚函数) 进化式的问题求解(继承的构造函数) 4、确定性 确保每个行为项都有一个正确的解释,系统不

17、 会因不能响应某一行为而失败; 确定性与类型的正确性有关; 三、面向对象计算的基本特征 面向对象系统的三要素:对象、类和继承; (一)、对象 1、概念上 对象是代表着正在创建的系统中的一个实体; 2、实现形式上 对象是一个状态和操作(或方法)的封装体; 3、对象的定义 状态:对象的状态由这个对象的属性和这些属性 的当前值决定。属性是静态的,当前值是动态的; 一个对象具有状态、行为和标识。 三、面向对象计算的基本特征(续) 行为:一个对象如何以状态变化和消息传递的形 式进行作用和对外界进行反应。 一个对象的行为代表了这个对象的外部可见 的和可测试的活动; 一个对象的状态代表着它的行为的累积结果;

18、 标识:标识是一个对象固有的一种特性,该特性 将这个对象与其他对象区别开来; 属性1 属性2 . 属性n 值11 值21 . 值n1 值12 值22 . 值n2 对象1 行为 值11 值21 . 值n1 值12 值22 . 值n2 对象2 行为 三、面向对象计算的基本特征(续) 4、对象的分类 实体对象 界面对象 控制对象 按作用分类 存储信息的对象 支持系统的主要功能 5、对象的确认 发明对象:主要是控制对象; 发现对象:主要是实体对象或界面对象; (二)、类 1、什么是类 三、面向对象计算的基本特征(续) 类是创建对象的样板,它包含着所创建对象 的状态描述和方法的定义。类的完整描述包含了

19、外部接口和内部算法以及数据结构的形式; 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对象对

20、象2 2 对象对象k k 对象对象p p 类类 类与对象的关系类与对象的关系 三、面向对象计算的基本特征(续) 四、C+语言中的抽象支持 控制抽象:用于排列任意动作的顺序的一种方法; 三种语句控制结构:顺序、循环、分支 过程抽象(面向过程):对一组输入数据的一个 计算动作和产生的输出结果; 数据抽象(面向对象):类是实现抽象数据类型 的工具; 五、C+对面向对象程序设计方法的支持 C+支持数据封装(数据抽象) C+中,类是支持数据封装的工具,对象则 是数据封装的实现; C+中包含有私有、公有和保护成员 每个可能的消息对应一个相应的方法,方法 通过函数来定义; C+中通过发送消息来处理对象 C+

21、中允许友元破坏封装性 C+中允许函数名和运算符重载 C+支持继承性 C+支持动态联编 六、C+对C语言的改进 增加了新的运算符::,new,delete等; 改进了类型系统,增加了安全性; 引进了引用概念; 允许函数重载,允许设置缺省参数,提高了编程 的灵活性; 引进了内联函数,提高了程序的效率; 可以根据需要随时对变量进行说明; 七、C+程序的编辑、编译和运行 (一)、编辑:源文件的扩展名为.cpp (二)、编译 1、预处理过程 词法分析:单词 语法分析:构造程序的格式 符号表:程序中的各种符号及其属性 错误处理程序: 生成目标代码:目标文件扩展名.obj 2、编译 过程 3、连接过程:可执

22、行文件扩展名.exe 三、运行 八、C+程序的编辑、编译和运行(续) 源程序.cpp 目标文件.obj 可执行文件.exe 编译器 连接器 磁盘中的 #include文件 C+库文件.LIB 编译过程:编译过程: 1)启动)启动Visual C+,选择选择“文件文件”菜单中的菜单中的“新建新建” 命令,选择命令,选择“文件文件”标签中的标签中的“C+ Source File” 选项。选项。 2)选择源程序存放的目录和输入源程序名,单击)选择源程序存放的目录和输入源程序名,单击 “确定确定”。 3)在编辑器中编写源程序。)在编辑器中编写源程序。 4)单击)单击F7或或“编译编译”中的中的“重建全

23、部重建全部”编译源程编译源程 序,若编译通过,单击序,若编译通过,单击“执行执行”,在,在DOS屏上看屏上看 结果,任按一键返回编辑器。结果,任按一键返回编辑器。 启动启动VC+ 编译系统编译系统 VC+编译编译 系统界面系统界面 单击单击“File”菜单菜单 中中“New”命令命令 选择选择“Files”选项卡选项卡 选择选择C+源源 文件命令文件命令 输入文件名输入文件名 输入文件输入文件 存放位置存放位置 单击选择单击选择 驱动器驱动器 选择驱动选择驱动 器或目录器或目录 C+源文件源文件 编辑界面编辑界面 输入输入C+ 源代码源代码 可以将此源可以将此源 代码另起文代码另起文 件名存盘

24、件名存盘 选择编译命令,将源文选择编译命令,将源文 件件.cpp生成生成.obj文件文件 如果编译出错,会出现提示信息,如果编译出错,会出现提示信息, 指出错误的位置及种类指出错误的位置及种类 错误所在行错误所在行 错误的原因错误的原因 双击错误双击错误 所在行所在行 光标移到该行光标移到该行 生成可执生成可执 行文件行文件 通过后单通过后单 击该命令击该命令 运行程序运行程序 运行结果显示运行结果显示 在在DOS屏上屏上 注意:不可以在软盘上注意:不可以在软盘上 运行程序!应该把保存运行程序!应该把保存 在软盘中的源文件拷贝在软盘中的源文件拷贝 到硬盘的目录中再运行到硬盘的目录中再运行! 源

25、程序所在目录源程序所在目录 未编译前,只未编译前,只 有一个源程序有一个源程序 编译运行后,出编译运行后,出 现众多附加文件现众多附加文件 同时,产生一个同时,产生一个 子目录子目录Debug Debug目录中,有目录中,有 obj和和EXE文件文件 补: C+的字符集 大小写的英文字母:az,AZ 数字字符:09 特殊字符 空格!#%.,() 词法记号 1、关键字(保留字) 表1-1C+的关键字 autoboolbreakcasecatchcharclass constconst_cast continue defaultdeletedodouble dynamic_cast else en

26、umexplicitexternfalsefloat forfriendgotoifinlineintlong mutablenewoperator privateprotected publicregister reinterpret_castreturnshortsignedsizeofstatic static_cast structswitchtemplate thisthrowtrue trytypedef typeidtypename unionunsigned virtual voidvolatile while 词法记号(续) 2、标识符 组成规则:以字母或下划线开始,其后跟零

27、个或 多个字母、数字或下划线; 不能以数字开始 正确标识符:Result, DoubleList, _first, first_ 错误标识符:1first 标识符的长度任意(受编译器限制); 区分字母的大小写; 不能使用系统的保留字; 例如:ADD, Add, add 词法记号(续) 3、运算符 单目 双目 三目 运算符 5、分隔符 () , 分隔符 : 4、各种文字 数字 字符文字 串文字 文字 布尔文字 ; 空白 一、空白 包括:空格、制表符、换行符、注释 功能:指示词法记号的开始和结束位置; 二、注释 /*/ / C+程序的结构 一、C+示范程序 #include void main()

28、 coutHello world! endl; 二、C+程序的组成 预处理命令 输入输出 函数 语句 变量 其他 I/O流库,提供所 有的输入输出操作 cout:流类对象 :提取符 例如: cinPlease input two integers:; cinab; endl:换行; 1.3.1 C+的输入输出 1、用cout进行输出 举例:如果要输出a=2,b=3,c=4(假如已赋值) couta=a,b=b,c=“ cabc; cina; cinb; cinc; 1.3C+对C的补充 基本数据类型 一、基本数据类型 整型int 浮点型(实型) 字符型char 基本数 据类型 逻辑型bool

29、空值型void 单精度浮点数float 双精度浮点数double 用于函数和指针 基本数据类型(续) 二、数据类型修饰符 signed:有符号 unsigned:无符号 short:短型 long:长型 说明: 3) long修饰符还适用于双精度浮点数; 2) 上述修饰符均可用于整型和字符型; 1) 类型修饰符可以修饰除void、bool类型以外的 其他类型; 基本数据类型(续) 三、基本数据类型列表 表2-1C+的基本数据类型 类类型型名名字字宽宽(字字节节)范范围围 boolfalse, true char1-128127 signed char1-128127 unsigned char

30、10255 short int2-3276832767 signed short int2-3276832767 unsigned short int2065535 int4-21474836482147483647 signed int4-21474836482147483647 unsigned int404294967295 long int4-21474836482147483647 signed long int4-21474836482147483647 unsigned long int404294967295 float43.4E 10-383.4E 1038 double81

31、.7E 10-3081.7E 10308 long double103.4E 10-49323.4E 104932 基本数据类型(续) 说明: 1) 表中的int可以省略,即在int之前有修饰符出 现时,可以省略关键字int; 2) 单精度类型float、双精度类型double、长精度 类型long double统称浮点类型; 3) char类型和各种int类型统称整型类型;char类 型变量在内存中以它的ASCII码值的形式存储; 4) 字宽(字节)取决于操作系统和编译器的实现, 可用sizeof验证; 常量 一、整型常量(无小数部分) 1、表示方法 十进制 八进制 十六进制 2、十进制表示

32、 由09的数字组成 不能以0开始 无前缀 例:132, -345 3、八进制表示 由0 7的数字组成 以0为前缀 例:010, -0536 4、十六进制表示 由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) 无后缀时,整型

33、常量类型按如下顺序确定: int, (unsigned), long, unsigned long 十进制时无 常量(续) 二、浮点型常量 由整数部分和小数部分构成; 只有十进制表示; 一般表示形式(小数表示形式): k整数部分与小数部分可以省去一部分, 但不能全部省去; k例如:5.,.25,4.07 常量(续) 科学表示形式: k在小数表示法后面加E(或e)表示指数; k例如:23.5E6,.032E-5,.3e10 k指数部分可正可负,但必须为整数; 浮点常量的缺省数据类型为double型; 后缀F(或f)表示float类型; 后缀l(或l)表示long double类型; 常量(续)

34、三、字符常量 由一对单引号括起的一个字符表示; 其值为所括起字符在ASCII表中的编码; 所括起字符的表示方法: k图形表示法 该方法适用于有图形符号的可打印字符; 例如:A,a,* k转义序列表示法 该方法适用于所有字符,尤其是无图形符号 的不可打印字符; 常量(续) K转义序列表示方法:以反斜线()开头,后跟字符 的ASCII码值; K八进制表示: ddd; 例如:101 K十六进制表示: xhh; 例如:x41 表2-2C+中常用转义序列符 符号含义 a 响铃 n 换行符 r 回车符 t 水平制表符(tab 键) b 退格符(backspace 键) 反斜线 单引号 双引号 0 空字符

35、常量(续) 四、布尔常量 有两个值:true和false; 五、字符串常量(串常量,字符串) 一对双引号括起的字符序列,字符序列可以 包含空格、转义序列或任何其他字符,这些 字符不一定是C+字符集中的字符,只要C+ 编译器支持即可; 例如:This is a string; 串常量与字符常量的区别: 常量(续) 由一个字符型变量存 放 由一维数组存放 字符常量串常量 用单引号括起 用双引号括起 字符串有一个结束符, 该结束符用0表示 字符常量a在内存中 占用一个字节 字符串常量a在内存 中占用两个字节 可进行加、减法运算 可进行连接、拷贝运算 常量(续) 六、符号常量 用来表示C+中的常量,即

36、用一个与常量相关 的标识符来替代常量; 优点:增加可读性,增强可维护性; 例如:PI表示3.1415926 定义方法:使用类型说明符const; 例如:const int size=80; 定义的符号常量必须初始化; 一个符号常量可看作是一个只读变量,由const 定义的常量的值不可以改变; 1.3.2 用const定义常变量 宏定义: (1)#define PI 3.14159 (2)#define A 2 #define B 3 #define C A+B coutb?a:b) 1.3C+对C的补充 注意: (1)只是替换 (2)没有类型检验 (3)而且是在编译前进行,不分配存储空间 (4

37、)末尾没有分号,有分号作为宏体的一部分 (5)不能有单行注释 (6)位置只在文件的上方 1.3C+对C的补充 用const定义符号常量的方法: (1)int const a=3; (2)const int a=3; 注意: 位置可以任意(局部和全局) 要带分号 有类型检测,有空间分配,是编译时决定的,其它 变量是运行时决定 一旦定义后,不能作为左值 1.3C+对C的补充 常指针常指针 Line1:#include Line2:const double pi=3.1415; Line3:const double r; Line4:void main() Line5: Line6: double

38、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的值的值 #define与const定义符号常量的区别 const产生一个具有类型 的符号 #define仅产生文本替换, 而不管内容是否正确 const double PI=3.1415;#define PI 3.1415 使用const可以定义一个 局部常量,可局部在

39、一 个函数体内 用#define定义的常量的作 用域是从定义时开始,直 到使用#undef取消定义时 为止,如果不取消定义, 直到整个文件结束 使用const定义常量是一 个说明语句,用分号(;) 结束 使用#define定义常量是 一个预处理命令,不能 用分号(;)结束 地址值 变量 一、变量的三个基本要素 名字 类型 值 三要素 数据值 地址值 int c; c=5; 内存 5 . c 地址值 1000H 变量 类型 变量名 数据值 二、变量的定义 可以在程序中随时定义变量,只要在该变量被 使用前定义即可; 定义格式:; 例如:int a,b,c;double x,y,z; 变量(续) 同

40、一程序块内不可以定义同名变量; 初始值 k变量定义时可赋初始值; k声明格式: 数据类型 标识符1(初始值1), ,标识符n(初始值n); 数据类型 标识符1=初始值1, ,标识符n=初始值n; k例如:double price=15.5;int size=100; k未被初始化的变量的值或者是默认值,或者是 无效值,由变量类型决定; 变量可被赋值,由变量名标识; 1.3.7 引用(C+) 标识对象的一种机制; 对对象存储地址的抽象,但引用不是值; 引用有类型; 变量的别名; 1、定义格式 或 2、初始化与赋值 定义引用时必须初始化; 可以将一个引用赋给某个变量; 引用可被赋值; 引用(续)

41、示例: int a=3; int int n=m; int *p= m=m+5; 3a8 p m 3n 定义引用并初始化 将引用赋值给变量 a=8,对引用的操作就是 对被引用者的操作 3、引用的功能 用做函数的参数或函数的返回值; 函数不能返回对局部对象的引用; 引用(续) 示例: int return r; 错,r是局部对象 4、指针与引用的区别 指针通过地址间接访问某个变量,引用通过别 名直接访问某个变量; 引用必须初始化,一旦被初始化后不得再作为 其他变量的别名; 正确:int 引用(续) 例1:分析下列程序的输出结果。 #include void main() int val(5);

42、int refv=refv+5; coutvalendl; int *p= cout*ptval1endl; 输 出 10 1010 引用(续) 例2:分析下列程序的输出结果。 #include int return r; void main() int a=1,3,5,7,9; f(2,a)=55; for(i=0;i5;i+) coutai、=、=、=、!= 前四种优先级高于后两种; 逻辑运算符 双目运算符: 或sizeof(); 格式: (); 或 () ; 其他运算符(续) 强制类型转换可将高类型转换为低类型,是一 种不安全的转换; 示例: double f(3.85); int h;

43、 h=int(f); 该转换是暂时的,一次性的; 示例: int a(3),m; double b; b=3.56+double(a); m=a+5; 表达式的种类 由运算符和操作数组成的式子; 常见的表达式 k算术表达式; k逻辑表达式; k关系表达式; k赋值表达式; k条件表达式; k逗号表达式; 表达式的种类(续) 注意事项: k连续的两个运算符之间用空格分隔; k可用括号来改变运算符优先级; k双目运算符的左右可以用空格符和操作数分开; k过长的表达式可分成几个表达式; 表达式的值和类型 一、确定表达式的值 二、表达式求值方法与确定类型的方法 先确定运算符的功能; 确定计算顺序:先考

44、虑优先级,再考虑结合性; 表达式的值和类型(续) 例1:分析下列程序的输出结果(算术表达式)。 #include void main() unsigned a(0 xab),b(20); a a=a; coutatby; x=y; x|=yy; y coutxtyendl; 输出: 020 -1 1 表达式的值和类型(续) 例2:分析下列程序的输出结果(关系表达式)。 #include void main() char x(m),y(n); int n; n=xy; coutnendl; n=x=y-1; coutn3)+(y-x=1); coutnendl; 输出: 1 1 3 表达式的值和

45、类型(续) 例3:分析下列程序的输出结果(逻辑表达式)。 #include void main() int x,y,z; x=y=z=1; -x coutxtytzendl; +x coutxtytzendl; +x coutxtytzendl; 输出: 011 122 212 注意逻辑 表达式的 求值方法 表达式的值和类型(续) 例4:分析下列程序的输出结果(条件表达式)。 #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,5 3,5,8

46、 注意三目 运算符的 判断条件 输 出 表达式的值和类型(续) 例5:分析下列程序的输出结果(赋值表达式)。 #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,-7 4,6,12 表达式的值和类型(续) 例6:分析下列程序的输出结果(逗号表达式)。 #include void main() int a,b,c; a=1,b

47、=2,c=a+b+3; couta, b, cendl; c=(a+,a+=b,a+b); couta, b, cendl; 1,2,6 4,2,6 输 出 表达式中的类型转换 一、隐含转换 双目运算中操作数的类型转换; 是一种保值转换,转换类型由低到高; 转换规则: int unsigned long unsigned long double short,charfloat 二、强制转换 显式强制转换(通过强制转换运算符实现); 表达式中的类型转换(续) 隐式强制转换: k在赋值表达式中,当左值(赋值运算符左边 的值)和右值(赋值运算符右边的值) 的类型 不同时,一律将右值类型强制转换为左值

48、的类型; k在函数有返回值的调用中,将return后面的表 达式的类型强制转换为该函数的类型; 显式 隐式 赋值表达式 函数返回值 隐含转换 强制转换 类型转换 类型定义 1、格式 typedef ; 例如: typedef double wages,bouns; wages weekly; bouns monthly; 2、自定义类型的作用 改善程序的可读性,增加所定义变量的信息 书写简练 提高程序的可移植性 预处理和语句 预处理功能 语句 选择语句 循环语句 转向语句 预处理功能 一、预处理命令及预处理功能 1、预处理命令 C+源程序中包含的各种编译命令在程序被正 常编译之前执行; 预处理

49、命令不是C+语言的一部分; 2、预处理功能 由预处理命令实现的功能; 二、常用的预处理命令 文件包含命令 宏定义命令 预处理功能(续) 以 # 为引导; 每条预处理命令单独占用一行,同一行不能 有其他预处理命令和语句; 三、预处理命令使用说明 条件编译命令 停止编译命令 预处理命令的位置可以放在开头、中间和结尾; 预处理命令可以续行,续行符为 ; 预处理命令不是语句,不能以分号(;)结束; 文件包含命令 一、功能 指示C+编译器将一个文件(头文件)的内容 嵌入到该指令所在的文件中该指令所在位置处; 头文件指存放与标准函数有关的信息,或者存 放符号常量、类型定义、类和其他复杂类型的 定义以及与程

50、序环境相关信息的.h文件; 二、格式 #include 由系统提供并放在指定子目录中的头文件; #include 文件名 由用户定义,放在当前目录或其他目录下的头文 件或其他源文件; 文件包含命令(续) 三、说明 文件包含命令一般放在程序头; 一条文件包含命令只能包含一个文件; 文件名:myfile.h #include myfile2.h #include myfile3.h 文件包含命令可以嵌套; 包含文件不易过多; 条件编译命令 一、功能 用来定义某些编译内容要在满足一定条件下才 参与编译,否则不参与编译;可使同一源程序在不 同的编译条件下产生不同的目标代码。 二、格式 格式一:#ifd

51、ef #else #end if 或#ifdef #end if 条件编译命令(续) 格式二 #ifndef #else #end if 或 #ifndef #end if 格式三 #if #elif #elif . #else #end if 条件编译命令(续) 例1:分析下列程序的输出结果。 #include #define A 10 void main() #if A0 cout0endl; #elif A0 couta0endl; #else couta=00 条件编译命令(续) 例2:避免重复引用某个头文件。 /main.cpp #include myfile1.h #include

52、 myfile2.h /myfile1.h #include myhead.h /myfile2.h #include myhead.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:用于调试。 调试时: #define DEBUG 1 . #if DEBUG=1 coutOKendl; #end if . 调试后: #defin

53、e DEBUG 0 . 停止编译命令 一、格式 #error 二、功能 当编译器遇到该指令时,显示“字符序列”, 即错误信息,然后停止对该程序的编译,从而可以 在编译阶段发现程序中的错误; 三、示例 假设country值为:US、ENGLAND、CHINA 程序中有如下语句: 停止编译命令(续) / #else #error You define country incorrectly #endif 当country的值不是上述三者之一时,编译器将 显示: 然后停止编译。 You define country incorrectly 语句 1、表达式语句和空语句 表达式语句:任何一个表达式加上

54、分号(;); 空语句:只有一个分号(;)的语句; 2、复合语句和分程序 复合语句:由两条或两条以上的程序构成,并 由一对花括号括起; 分程序:又称块结构,含有一条或多条说明语 句的复合语句; 条件语句 if () else if () else if () . else if () else 说明: if语句可以嵌套,在此情况下,else与最近的 一个没有与else配对的if配对。 开关语句 switch () case : case : . case : default 注意: 在执行语句序列中如果遇到break语句,则退 出switch语句,执行后面的语句;如果其后的语 句序列中没有bre

55、ak语句,则一直执行至switch语 句结束。 开关语句(续) 例3:分析下列程序的输出结果。 #include void main() int i(1),j(0),m(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,5 循环语句 1、while循环语句 while () ; 2、do-while循环语句 do while (); do-while循环与while循环的区别: do-

56、while循环至少执行一次循环体,while循 环可能一次也不执行循环体; 3、for循环语句 for (d1;d2;d3) ; 4、多重循环 转向语句 1、goto语句 格式:goto ; goto语句只能在一个函数内进行转向; 2、break语句 格式:break; 适用情况: k用于开关语句的语句序列中,其功能是退出 开关语句,执行其后的语句; k用于循环体中,其功能是用来退出该重循环; 3、continue语句 格式:continue; 功能:在循环体中用来结束本次循环; 函数和作用域 函数的基本概念 函数的定义和说明 函数的调用 函数的参数 内联函数 函数重载 异常处理基础 作用域

57、返回类型为 void类型的 函数抽象 为过程抽象 函数的基本概念 函数结构:由花括号括起来的一个语句序列; 函数抽象:使用标识符对语句序列进行的抽象; 函数调用:函数级上的控制抽象,一种控制转移; 参数化:在函数抽象中对其所操作的值进行抽象 的过程; 形参与实参 函数抽象与过程抽象 k函数抽象的目的是进行求值 k过程抽象的目的是更新对象 C+中只有函数抽象 函数的定义格式 () 说明: 为函数返回值类型,若为void,则为过 程调用; 中的参数为形参,在函数被调用时进 行初始化,从而从被调用处获得数据; 函数体 函数的说明方法(函数的声明) 一、函数的说明原则 如果一个函数定义在先,调用在后,

58、调用前可 以不必说明; 如果一个函数定义在后,调用在先,调用前 必须说明; 二、函数的说明方法(原型说明) (); 三、示例 参数表中的参数 名称可以省略 1.3C+对C的补充 1.3.3 函数原型声明 一般形式:函数类型 函数名(参数表); 注意: 参数表中一般包括参数类型和参数名,也 可以只包括参数类型而不包括参数名。 例如: int max(int x,int y);或int max(int,int); int max(int a,int n);或int max(int ,int); int max(int *p);或int max(int *); 函数的说明方法(续) #include

59、 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; 例1:分析下列程序的输出结果。 函数原型声明 函数的说明方法(续) void fun2() coutIt is in fun2. endl; fun1(); coutIt is back in fun2. endl; void fun3() c

60、outIt 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 in main. It is in fun3. 输 出 函数的值和类型 说明: 实参表的个数由形参决定,用来初始化实参, 多个实参用逗号分隔; 实参的个数与类型必须与形参的个数与类型完 全一致; 一、函数调用格式 (); 实参对形参的初始化按其位置进行; 函数的值和类型(续) 关于return语句的说明: 有返回值的return语句可以返回一个表达式的值, 从

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论