1、第第1 1章章 C+C+语言基础语言基础nC+是一种以是一种以C语言为基础开发的高级语语言为基础开发的高级语言,一般认为言,一般认为C是是C+的一个子集的一个子集或基础或基础语言,但二者又是完全独立的。语言,但二者又是完全独立的。nC+适合大型程序的开发与设计适合大型程序的开发与设计nC则适合于更底层的项目开发则适合于更底层的项目开发1.1 C+语言概述语言概述21.1.1 标准标准C+nC+发明者:发明者:Bell实验室实验室Bjarne Stroustrup博士博士nC+第一定义:第一定义:“带类的带类的C”C+保留了保留了C作为一个子集作为一个子集C+从从Simula语言引入了类的概念,
2、包括派生语言引入了类的概念,包括派生类和虚函数;借鉴了类和虚函数;借鉴了Algol语言的运算符重载等语言的运算符重载等特性。特性。31.1.1 标准标准C+(续)续)n起初,起初,C+编译系统只是一个预编译系统。编译系统只是一个预编译系统。n1988年,出现一个真正的年,出现一个真正的C+编译系统。编译系统。n1998年,年,ISO/ANSI C+标准正式通过并发标准正式通过并发布。布。n总体上,总体上,C+是一种混合语言,是集过程化是一种混合语言,是集过程化设计、面向对象、基于对象和泛型算法等设计、面向对象、基于对象和泛型算法等多种技术于一体的编程语言。多种技术于一体的编程语言。n学习学习C
3、+最重要的是集中关注概念,不要迷最重要的是集中关注概念,不要迷失在语言的技术细节中。失在语言的技术细节中。41.1.2 C+语言的简单程序语言的简单程序#include using namespace std;int main( )int x = 10, y = 20;int z = x+y;cout “sum is ” z endl;return 0;输出结果:输出结果:sum is 3051.1.2 C+语言的简单程序(续)语言的简单程序(续)n1 main函数与程序结构函数与程序结构n一个完整的程序有且只能有一个一个完整的程序有且只能有一个main()主主函数或入口函数函数或入口函数n标
4、准标准C+要求要求main函数的声明类型为函数的声明类型为int,只要在末尾加上只要在末尾加上return 0;61.1.2 C+语言的简单程序(续)语言的简单程序(续)nC+的程序结构的程序结构预处理命令部分预处理命令部分函数声明部分函数声明部分类型定义部分类型定义部分main函数定义函数定义其它函数定义其它函数定义n函数由函数体构成,一般包括变量定义、函数由函数体构成,一般包括变量定义、输入、运算和输出等内容。输入、运算和输出等内容。71.1.2 C+语言的简单程序(续)语言的简单程序(续)n2 头文件包含与名字空间头文件包含与名字空间固定写法:固定写法: #include /头文件包含头
5、文件包含 using namespace std; /名字空间声明名字空间声明可以将一个名字空间理解成包含若干定义的一可以将一个名字空间理解成包含若干定义的一个区域的名字。个区域的名字。标准标准C+所有定义都属于名字空间所有定义都属于名字空间std。81.1.2 C+语言的简单程序(续)语言的简单程序(续)n3 注释注释n+的的“块注释块注释”:* *和和* *为分界符号,为分界符号,与中的用法一致。与中的用法一致。n+的的“行注释行注释”:以:以/符号开始到一行符号开始到一行的结束。的结束。n使用注释符时的注意事项:使用注释符时的注意事项:标志符标志符/ /和和* *,/ /和和/ /之间不
6、可之间不可以分开。以分开。注释符对注释符对“/ /* *”和和“* */ /”不可以嵌套。不可以嵌套。注释符注释符/之后的注释结束于本行。之后的注释结束于本行。/和和/ /* *与与* */ /可以嵌套使用。可以嵌套使用。91.1.2 C+语言的简单程序(续)语言的简单程序(续)n思考题:下列程序是否正确?思考题:下列程序是否正确?#include using namespace std;int main() /*下面程序将在终端上输出下面程序将在终端上输出/*你好你好*/的字的字样样*/cout “你好你好!” endl;/*/输出字符输出字符*/return 0 ;/*/正常返回正常返回1
7、01.1.2 C+语言的简单程序(续)语言的简单程序(续)n4 输入输出对象输入输出对象n使用使用I/O流必须要包含流必须要包含“iostream”头文件。头文件。“#include ”告诉告诉C+编译器,将文件编译器,将文件iostream内容插到此程序中。内容插到此程序中。niostream中定义了一组标准类中定义了一组标准类输入输出流(输入输出流(I/O stream)类。类。n流流八位的字节序列。八位的字节序列。ncout是标准输出流类的一个预定义的对象,代表是标准输出流类的一个预定义的对象,代表控制台输出设备(控制台输出设备(console out)如:显示器。如:显示器。ncin是
8、是cout的反义词,控制台输入,如键盘。的反义词,控制台输入,如键盘。111.1.2 C+语言的简单程序(续)语言的简单程序(续)ncincin与与coutcout说明说明用来取代用来取代scanf和和printf,更安全、更方便。更安全、更方便。1 格式控制符与输出数据的类型不一致格式控制符与输出数据的类型不一致2 scanf()的第二个参数应是一个指针参数,以上错误的第二个参数应是一个指针参数,以上错误C编编译器不能检查出来。译器不能检查出来。#includevoid main() int i; float f; scanf(“%f”,i); printf(“%d”,f);#include
9、using namespace std;void main() int i; float f; cini; cout”在在C+中仍保持中仍保持C中中“右移右移”功能,但用于输入时扩充了其功能,表示将从标功能,但用于输入时扩充了其功能,表示将从标准输入流准输入流(键盘键盘)读取的数值传送给右方指定的变读取的数值传送给右方指定的变量。量。 如:如:cinx; /键盘输入的数据自动转换为变量键盘输入的数据自动转换为变量X的类型,并存入变量的类型,并存入变量X内。内。n可以可以连续输连续输,如,如cinabc;不用顾忌类型。不用顾忌类型。 它按书写顺序从键盘上提取所要求的数据,并存它按书写顺序从键盘上
10、提取所要求的数据,并存入对应的变量中。入对应的变量中。n用用cin输入时,要注意使用输入时,要注意使用间隔符间隔符 (空格、回车、空格、回车、Tab键键)。131.1.2 C+语言的简单程序(续)语言的简单程序(续)cout中运算符中运算符“”在在C+中保持中保持C中中“左左移移”功能,表示将右方变量的值写到标准功能,表示将右方变量的值写到标准输出流输出流cout(即屏幕即屏幕)中。中。 “”允许用户允许用户连续输出一串数据或表达式。连续输出一串数据或表达式。可以使用格式控制可以使用格式控制(与与C兼容兼容),默认的转换默认的转换基数是十进制。基数是十进制。如:如:dec(十进制十进制), h
11、ex(十六进制十六进制), oct(八进制八进制), endl, t, n等。等。141.1.2 C+语言的简单程序(续)语言的简单程序(续) C中换行用中换行用n; C+中换行用中换行用endl; 如:如:coutxendl; coutyn;等价于等价于printf(“%dn”,x);#include using namespace std; void main() int x=25; couthexxdecxoctxn;输出结果:输出结果:19 25 31151.1.2 C+语言的简单程序(续)语言的简单程序(续)n5 5 灵活的局部变量声明灵活的局部变量声明下面局部变量声明是否正确?为什
12、么?下面局部变量声明是否正确?为什么?f ( ) int i; i=10; int j; j=25; /161.1.2 C+语言的简单程序(续)语言的简单程序(续)n6 编码习惯编码习惯尽量保持好的书写风格是必须养成的习惯。尽量保持好的书写风格是必须养成的习惯。要注意程序的书写格式,如缩进格式和成对符要注意程序的书写格式,如缩进格式和成对符号的对齐排列等。号的对齐排列等。171.2 面向对象的程序设计思想面向对象的程序设计思想nC向向C+过渡的实质是由过渡的实质是由过程化程序设计过程化程序设计思想向思想向面向对象程序设计面向对象程序设计的思想的转变。的思想的转变。程序设计语言的发展程序设计语言
13、的发展 硬件发展硬件发展软件危机软件危机结构化程序设计结构化程序设计软件工程软件工程面向对象技术面向对象技术 机器码机器码低级低级高级;高级;181.2.1 过程化的程序设计过程化的程序设计n面向过程编程面向过程编程它是早期的程序设计范型,它考察整个设计过程,以功能分解为中心。n面向过程的特征面向过程的特征早期程序设计者认为: 程序 = 数据结构 + 算法 这个公式贯穿于整个程序设计的始终,无论程序是系统程序还是模块程序。191.2.1 过程化的程序设计(续)过程化的程序设计(续)n过程化的问题处理思路形成了一套有效的过程化的问题处理思路形成了一套有效的程序设计方法,称为程序设计方法,称为结构
14、化方法结构化方法。程序设计采用自顶向下,逐步细分的方法展开。程序设计采用自顶向下,逐步细分的方法展开。模块化模块化使用三种基本控制结构:顺序、选择、循环。使用三种基本控制结构:顺序、选择、循环。n三种结构的共同点:每种结构只有三种结构的共同点:每种结构只有一个入口一个入口和和一个一个出口出口。201.2.1 过程化的程序设计(续)过程化的程序设计(续)n过程化方法应用举例:int main( )开始函数();开始函数();绘制画面函数(初始棋局);绘制画面函数(初始棋局);重复下述步骤重复下述步骤 走棋函数(黑子);走棋函数(黑子); 如果(判断输赢(棋局)已定出输赢)停止重复;如果(判断输赢
15、(棋局)已定出输赢)停止重复;走棋函数(白子);走棋函数(白子);绘制画面函数(棋局);绘制画面函数(棋局);如果(判断输赢(棋局)已定出输赢)停止重复;如果(判断输赢(棋局)已定出输赢)停止重复;输出结果函数(棋局);输出结果函数(棋局);结束函数();结束函数();211.2.1 过程化的程序设计(续)过程化的程序设计(续)n面向过程的不足面向过程的不足强调功能分解,为了实现功能,有时数据结构屈从于算法,结果造成数据结构和过程的分离。n由于过程化设计中的数据与过程是相互独立的,一个过程完全可以作用到并不相关的数据上,也不能保证对数据操作的合理性,数据对于算法完全是被动的。n此种操作是一种“
16、谓语宾语”结构。对于庞大、复杂的程序难以开发和维护对于庞大、复杂的程序难以开发和维护221.2.2 面向对象的程序设计面向对象的程序设计n面向对象编程面向对象编程是一种以对象为中心的程序设计范型。也可以说是一套概念和想法,它与面向过程程序设计相对应,是一种用计算机程序来描述实际问题的思路。n面向对象的特征面向对象的特征OO(Object-Oriented)程序设计者认为: 程序 = 对象 + 消息 这个公式表明面向对象的程序以对象为程序组成单位,以消息为动力(驱动)。231.2.2 面向对象的程序设计(续)面向对象的程序设计(续)n面向对象方法应用举例:int main()定义对象,包括黑棋选
17、手,白棋选手,裁判,组织者;定义对象,包括黑棋选手,白棋选手,裁判,组织者;裁判确定比赛开始();裁判确定比赛开始();组织者绘制画面();组织者绘制画面();重复下述步骤重复下述步骤 黑棋选手黑棋选手.走棋();走棋();如果(裁判如果(裁判.判断输赢()已定出输赢)停止重复;判断输赢()已定出输赢)停止重复;白棋选手白棋选手.走棋();走棋();组织者组织者.绘制画面();绘制画面();如果(裁判如果(裁判.判断输赢()已定出输赢)停止重复;判断输赢()已定出输赢)停止重复;组织者组织者.输出结果();输出结果();裁判裁判.确定比赛结束();确定比赛结束();241.2.2 面向对象的程
18、序设计(续)面向对象的程序设计(续)n面向对象的好处面向对象的好处以对象为单位组织程序,更接近人思维方式,OO借鉴了认知论的观点。不同对象各司其职,对象自身行为的实现方式的改变不会影响到其它对象,对象间通过互通消息实现合作。从实现上看,对象的每次操作都是在该对象接收到一定消息后的自主行为(用“对象.函数名”形式表示),具有“主语谓语”的形式。251.2.2 面向对象的程序设计(续)面向对象的程序设计(续)n面向对象和面向过程面向对象和面向过程两者不是对立的,面向对象是面向过程发展到一定阶段的产物,是程序设计的高级阶段,面向对象以面向过程为基础。n二者的适合情况二者的适合情况对于一些简单的问题,
19、基于过程的解决方法是十分有效的。对于大型、复杂的系统,采用面向对象的方法更能显示出优势,有利于利用对象构成软件“积木插件”,进而在一定的程度上解决软件重用的难题。261.3 面向对象程序设计的主要特点面向对象程序设计的主要特点n面向对象系统最突出的特征面向对象系统最突出的特征 封装性、继承性、多态性(三个特性)n封装的概念和数据抽象(类)密切相关封装的概念和数据抽象(类)密切相关n现实中的例子人们使用录音机,人们使用录音机,只要只要知道键的知道键的功能功能即可(放即可(放音、录音、停止、倒带等),音、录音、停止、倒带等),不需要不需要知道这些知道这些功能是如何功能是如何实现实现的,也不需要知道
20、其内部电路的,也不需要知道其内部电路或构造。或构造。271.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n1 类与封装类与封装n类的概念类的概念类是一组具有相同属性和行为特征的对象的抽象描述。n类和对象的关系类和对象的关系抽象和具体的关系,类是多个对象的归纳和总结(分类的结果),对象又是类的个体实物,一个对象就是类的一个实例。281.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n类和对象类和对象类型和变量类型和变量类和对象实际上就是C的数据类型和变量,只不过在C+中,统称为类和对象。n对象的状态对象的状态类没有具体的值,对象才有,对象的这些具体的值称为对
21、象的状态。类类 对象对象实例化实例化声明声明291.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n对象状态举例:对象状态举例: Teacher LiMing; LiMing.age = 30;LiMing.degree = “doctor”;LiMing.title = “professor”;名称名称LiMingage30degreedoctortitleprofessor301.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n类的结构类的结构类的结构和对象的组成是严格对应的!类中的成分有两种:数据成员和成员函数。类类数据成员数据成员对应对象的对应对象的
22、属性属性,也叫做,也叫做成员变量成员变量。成员函数成员函数对应对象的对应对象的方法方法,是类功能的载体。,是类功能的载体。311.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n类的结构实例类的结构实例 数据成员数据成员 成员函数成员函数class Teacher int age; char* degree; char* title;public: void Study( ); void Teach( ); int TellAge( );;321.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n*类和对象的作用周期类和对象的作用周期 类只在源程序的代码中出现
23、,它是编译器生成对象的说明书,并不会在运行的程序中出现 ,即类只在编译时存在; 对象作为类的实例是在运行的程序中出现,并占有内存空间,它是程序运行时存在的实体,是机器指令操作的内容。331.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n对象的特性对象的特性 对象是面向对象程序设计的最重要的细胞和基石,它有如下的特性: 1 封装性封装性隐藏内部细节 2 模块独立性模块独立性实体的抽象(类) 3 动态连接性动态连接性消息机制 4 易维护性易维护性更新在边界内341.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n对象的交互对象的交互 现实世界的对象并非孤立的实
24、体,它们现实世界的对象并非孤立的实体,它们间存在着间存在着联系联系,从而构成不同的系统。,从而构成不同的系统。 面向对象程序设计中,对象之间的联系面向对象程序设计中,对象之间的联系我们称之为我们称之为对象的交互对象的交互。n对象交互的实现对象交互的实现 在在OOP中,对象交互的实现要用到一个中,对象交互的实现要用到一个重要的工具:重要的工具:消息消息。351.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n对象交互图示对象交互图示n消息消息 对象的交互中介(请求或通知)n消息传递消息传递 面向对象的程序设计中对象协作机制对象对象1对象对象2消息消息361.3 面向对象程序设计
25、的主要特点面向对象程序设计的主要特点(续续)n消息传递与调用消息传递与调用 实际上,对象的消息传递对应于程序设计实际上,对象的消息传递对应于程序设计中的中的过程(函数)调用过程(函数)调用。 比如:键盘对象的按键消息传给显示对象比如:键盘对象的按键消息传给显示对象n消息的发送和接收消息的发送和接收 发送消息的对象为发送消息的对象为发送者发送者或或请求者请求者,接收,接收消息的目标对象为消息的目标对象为接收者接收者或或服务者服务者(有处理(有处理消息的能力)。消息的能力)。371.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n消息的处理简单模型消息的处理简单模型 消息的处理就
26、是过程(函数)的消息的处理就是过程(函数)的执行执行。 某过程某过程 Teacher t; / t.Study(实参实参);/return 0; ; 代码后半部分消息传递给消息传递给t代码前半部分某过程代码在中对象对象t t的内容的内容 / /执行代码执行代码 Study(Study(参数参数) )381.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n消息的内容组成消息的内容组成 包含有接收者的名字,请求的方法,一个或多个参数。n消息机制可以扩充的很复杂消息机制可以扩充的很复杂n消息的性质消息的性质 1、一消息可以发给多个对象 2、一对象可以接受多个消息 3、对象可以响应消
27、息,也可不响应391.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n2 继承继承n类间的承袭关系类间的承袭关系继承所表达的是对象类之间的相互关系,这种继承所表达的是对象类之间的相互关系,这种关系让某类对象可以使用另外一类对象的特征关系让某类对象可以使用另外一类对象的特征和能力。和能力。父母父母孩子孩子继承继承401.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n继承类之间的几个特性继承类之间的几个特性 1 1 类间具有类间具有共享的特征共享的特征(数据和代码共享)(数据和代码共享) 2 2 类间具有差别和类间具有差别和新增部分新增部分(非共享内容)(非共
28、享内容) 3 3 类间具有类间具有层次结构层次结构n假如有类假如有类B B继承类继承类A A,则类则类B B 的对象具有类的对象具有类A A的一切特征,的一切特征, 此时,类此时,类A A为为基类基类或或父类父类或或 超类超类,类,类B B为为派生类派生类或或子类子类基类基类派生类派生类继承继承411.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n继承机制的优点继承机制的优点 1 1 代码重用代码重用,避免重复开发避免重复开发 2 2 增强一致性增强一致性,统一的处理接口和界面统一的处理接口和界面 3 3 代码进化代码进化,高效的扩充功能高效的扩充功能n为程序员提供了一种为
29、程序员提供了一种组织、构造组织、构造和和重用重用类类的方法。的方法。421.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n继承的分类继承的分类 从继承源上分,继承分为单继承和多继承窗口窗口对话框对话框玩具玩具车车玩具车玩具车 单继承单继承 多继承多继承431.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n继承的分类继承的分类 从继承内容上分,继承分为从继承内容上分,继承分为取代继承、包取代继承、包含继承含继承 、受限继承、受限继承和和特化继承特化继承 1 取代继承取代继承子类覆盖了父类的内容子类覆盖了父类的内容 2 包含继承包含继承子类含有父类(的内容)
30、子类含有父类(的内容) 3 受限继承受限继承子类退化父类的内容子类退化父类的内容 4 特化继承特化继承子类比父类有更多内容子类比父类有更多内容441.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n继承与封装的关系继承与封装的关系封装是继承的基础封装是继承的基础;继承是封装的发展继承是封装的发展,是为了更好的、更大规模的封装。是为了更好的、更大规模的封装。n继承和封装的相似性继承和封装的相似性它们都提供了它们都提供了共享代码共享代码的手段:都是通的手段:都是通过过this指针指针来完成程序运行时的代码共享。来完成程序运行时的代码共享。451.3 面向对象程序设计的主要特点面向
31、对象程序设计的主要特点(续续)n3 多态多态n面向对象系统中,不同的对象收到相同的消息时产生多种不同行为方式的现象。nC+语言支持两种多态性语言支持两种多态性编译时多态性和运行时多态性C+中,编译时多态是通过重载实现的,而运行时多态是通过虚函数实现的。461.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n重载的概念重载的概念 重载是指用一个标志符(符号)来实现多个功能或行为的现象。n重载包括重载包括函数重载和和运算符重载n函数重载函数重载 使用同一个名字的多个函数定义。n运算符重载运算符重载 符号使用的重新定义。实质同函数重载。471.3 面向对象程序设计的主要特点面向对象
32、程序设计的主要特点(续续)n重载的目的重载的目的更好地表达行为共享,重载的函数或运算符一般都具有相似的操作。n重载的直接益处重载的直接益处减少了程序员的记忆负担。例如:print(char*); print(“Hello”); print(int); print(50);481.3 面向对象程序设计的主要特点面向对象程序设计的主要特点(续续)n面向对象语言应该具有下述特征:面向对象语言应该具有下述特征:支持类和对象(包括特性,如封装等)提供类间的继承机制支持多态(重载机制)n上述实际上就是面向对象系统的三大特性。491.4 C+集成化开发环境集成化开发环境nC+ Builder 6.0nVisual C+6.050第第1章章 结束结束51