1、C+面向对象程序设计第一章本章导读:C是面向过程的程序设计语言,也就是说 C程序的设计首要考虑的是如何通过一个过程,而对于C+,程序设计首先要考虑的是如何构造一个“模型”,这里的“模型”也称之为“对象模型”,因此C+是面向对象的程序设计语言。许多多人都把C+称为“带类的C”。的确,C+是在C的基础上引入面向对象的“类”的机制而形成的一门程序设计语言。C+既支持面向过程的程序设计,又支持面向对象的程序设计。面向对象的程序设计方法具有三大特征:封装性、继承性和多态性,其基本思想是尽可能模拟人类的自然思维方式来构造软件系统,不仅可以提高对用户需求的适应性,而且支持软件复用。本章要点 了解面向对象程的
2、思想 掌握面向对象中出现的基本概念 掌握面向对象中出现的基本特征 掌握面向对象程序设计的优点第第1章章 面向对象程序设计语言概述面向对象程序设计语言概述1.1 面向对象程序设计概述1.2 面向对象程序设计的特点1.3面向对象的系统开发方法1.4 程序举例1.5本章小结习题一1.1 面向对象程序设计概述面向对象程序设计概述 软件工程学家Coad/Yourdon认为:面向对象对象类继承消息。如果一个计算机软件系统采用这些概念来建立模型并予以实现,我们就说它就是面向对象的。下面我们将阐述面向对象的程序设计和面向对象的设计方法。1.1.1 面向对象程序设计 面向对象程序设计(Object Orient
3、ed Programming,缩写:OOP),指一种程序设计范型,同时也是一种程序开发的方法论。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。当我们提到面向对象的时候,它不仅指一种程序设计方法。它更多意义上是一种程序开发范式。在这一方面,我们必须了解更多关于面向对象系统分析和面向对象设计(Object Oriented Design,简称OOD)方面的知识。面向对象程序设计的雏形早在1960年的Simula语言中即可发现,当时的程序设计领域正面临着一种危机:在软硬件环境逐渐复杂的情况下,软件如何得到良好的维护?面向对象程序设计在某种程度上通过强调可重复性
4、解决了这一问题。20世纪70年代的SmallTalk语言在面向对象方面堪称经典,以至于30年后的今天依然将这一语言视为面向对象语言的基础。面向对象程序设计可以被视作一种在程序中包含各种独立而又互相调用的单位和对象的思想,这与传统的思想刚好相反:传统的面向过程程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,或者说是负有责任的角色。目前已经被证实的是,面向对象程序设计推广了程序的灵活性和可维护性,并且在大型项目设计中广为应用。1.1.2 面向对象的软
5、件工程 传统的软件工程方法曾经给软件产业带来了巨大进步,部分缓解了软件危机。但随着人们对软件产品的需求日益增加,其缺点越来越突出。为了克服传统软件开发的缺点,20世纪70年代提出了面向对象方法,现在它已经有很广泛的应用。面向对象软件工程是面向对象方法在软件工程领域运用的结果。1.1.3 面向对象的主要概念 1对象 2类 3封装 4继承 5消息 6 多态性1对象 对象是一个实体,可以是现实世界中具体的物理实体或概念化的抽象实体。在现实生活中,任何事物都是对象,具体存在的事物比如一个学校是对象,桌、椅是对象,抽象是事物比如规章制度也是对象。对象既可以很简单,也可以很复杂。一般一个对象都有一个区别于
6、其他事物的名字,也有描述它特征的属性,以及一组操作,这组操作既可以是自身所承受的,也可以是施加给其他对象的。在面向对象程序设计中,对象是一个封装数据(属性,静态特征)和操作(服务,动态特征)的实体,是构成系统的基本单元。当用户使用一个对象的时候,只能通过对象所提供的对外界的接口进行访问,而不必知道它的操作方法,就象我们知道的黑匣子一样,你可以使用它提供的接口,却不用内部的构造。这就大大方便了用户的使用,使对象的使用变的十分简单,同样,因为在外面看不到对象的内部,更无法对它进行修改,因而也有很高的安全性和可靠性。2类 类是具有相同属性和相同操作的对象的集合,是抽象数据类型的实现。在此我们定义一个
7、学生类,众所周知,学生所具有的属性一般有姓名,学号,性别,成绩等,相应的操作有入学,修改,显示,毕业等等。当入学时,的有一定的操作将此学生的信息加入大学生类中,而毕业是应该撤消其相应的信息。具体到每个学生则是学生类的一个实例,也就是一个对象。可以说,对象的抽象是类,类的实例是对象。在客观世界存在的是类的实例,即对象。比如上例中的学生,我们通常不说抽象的“学生”,而是一个个具体的学生,他们有着自己的姓名,学号等等。在面向对象的程序设计中,总是先声明类,再定义此类的对象,类是创建对象的模板,给出了属于该类的全部对象的抽象定义。就像大批量生产某种产品时,我们总是先把这种商品的模具做好,然后开始生产产
8、品,经过一个模具生产的产品,总有相同的特征。在这里,我们可以把模具看做类,而生产出来的产品看做对象。3封装 所谓数据封装就是指一组数据和与这组数据有关的操作集合组装在一起,形成一个能动的实体,封装是指把对象属性和操作结合在一起,构成独立的单元,它的内部信息对外界是隐蔽的,不允许外界直接存取对象的属性,只能通过有限的接口与对象发生联系。在面向对象的程序设计中,封装是把数据和实现操作的代码放在对象内部,隐蔽一些内部细节。类是数据封装的工具,对象是封装的实现。外界要访问时需要通过类,类的访问控制机制体现在类的成员中可以有公有成员、私有成员和保护成员。其中共有成员和保护成员允许访问,私有成员是不允许访
9、问的。对于外界而言,只需要知道对象所表现的外部行为,而不必了解内部实现细节。封装体现了面向对象方法的“信息隐蔽和局部化原则”。4继承 从已有的对象类型出发建立一种新的对象类型就是继承。继承在现实生活中是普遍存在的,比如说我们经常见到的汽车,它可以说是继承了机动车的一些特点,比如说都需要燃料,都需要引擎等等。同样它也有自己的一些特征,引入继承的一个原因是可以提高代码的重用率,更重要的是代码的扩充。面向对象的程序设计中,继承指子类(派生类)可以自动拥有父类(基类)的全部属性和服务。父类和子类是一般与特殊的关系。在定义一个子类时,可以把父类所定义的内容做为自己的内容,并加入若干新的内容。继承是面向对
10、象语言的重要特性,提高了软件的可重用性。继承分为单重继承和多重继承。单重继承时,一个子类只有一个父类;它继承的是一个基类的特征。多重继承时,一个子类可以有多个父类,它所继承的特征可能不止来自于一个基类。单重继承构成的类之间的关系是树状结构,多重继承构成的类之间的关系是网状结构。5消息 首先来解释一下消息,消息是指对象之间在交互通讯中所传送的信息,也可以说是一个对象对另一个对象发出的请求。一般情况下,我们把发送消息的对象成为发送者或者请求者,接受消息的对象称为接受者或者 目标对象。当一个对象向另一个对象发送消息请求某项服务时,接收消息的对象响应该消息,进行所要求的服务,并把操作的结果返回给请求服
11、务的对象。这样就完成了消息的传递。在现实生活中对象都不会是孤立存在的,他们之间都存在着这种或者那种的联系。在面向对象程序中也需要一种机制对这种联系进行描述,这就是消息机制。消息由三部分构成:消息名、接收消息的对象标识和参数。一般它具有以下几个性质:1一个对象可以接受不同的消息,进行不同的响应。2相同的消息被不同的对象接受,做出的响应也可以是不同的。3有些对象可以只接受对象,而不用响应,也就是说,对消息的响应并不是必须的。消息也可以分为两类,公有的和私有的。当有一些消息传递给一个对象时,如果消息是其他对象直接传给它的,那么这些消息就是公有(public)消息;如果消息是这个对象传给它自己的,那么
12、这些消息就称为私有(private)消息。6 多态性 多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。多态性也是面向对象系统的重要特征。在面向程序的设计中,多态性是指在基类中定义的属性和服务被子类继承后,可以具有不同的数据类型和表现出不同的行为。当一个对象接收到一个请求进行某项服务的消息时,将根据对象所属的类,动态地选用该类中定义的操作。不同的类对消息按不同的方式解释。多态性机制不但为软件设计提供了灵活性,减少信息冗余,而且显著提高了软件的可复用性和可扩充性。C+中的多态可以分为四类:参数多态,包含多态,重载多态和强制多态。这些我们将会在后面的课程中一一进行介绍。C+
13、支持两种多态性,分别是编译时的多态性和运行时的多态性。在此,编译时的多态性是通过重载实现的,运行时的多态性是通过虚函数实现的。这些内容将在第六章详细讲述。1.2 面向对象程序设计的特点 1.2.1传统程序设计方法的局限性 1.2.2 面向对象程序设计的主要优点1.2.1传统程序设计方法的局限性 存在下面几点局限性:()传统程序设计开发软件的生产效率低下。()传统程序设计难以应付日益庞大的信息量和多样的信息类型。()传统的程序设计难以适应各种新环境。实践证明,用传统方法开发出来的软件,维护时其费用和成本仍然很高,其原因是可修改性差,维护困难,导致可维护性差。1.2.2 面向对象程序设计的主要优点
14、()符合人们习惯的思维方法,便于分解大型的复杂多变的问题。()易于软件的维护和功能的增减。对象的封装性及对象之间的松散组合,都给软件的修改和维护带来了方便。()可重用性好。()与可视化技术相结合,改善了工作界面。在结构化程序设计中可以用下面的式子表示程序:程序=数据结构+算法+程序设计语言+语言环境 在面向对象程序设计中可以用下面的式子表示程序:程序=对象+对象+对象 对象=算法+数据结构+程序设计语言+语言环境1.3面向对象的系统开发方法 可分为五个阶段:()系统调查和需求分析阶段。()分析问题的性质和求解问题阶段。()整理问题阶段。()程序实现阶段。()软件测试阶段。1.3.1几种典型的面
15、向对象程序设计语言()Simula语言()Smalltalk语言()C+语言 ()Java语言()C#语言1.3.2 C+面向对象程序设计流程 图 1-1 程序开发流程 建立一个项目的基本步骤是:(1)利用编辑器建立程序代码文件,包括头文件、代码文件、资源文件等。(2)启动编译程序,编译程序首先调用预处理程序处理程序中的预处理命令(如#include,#define等),经过预处理程序处理的代码将作为编译程序的输入。(3)编译对用户程序进行词法和语法分析,建立目标文件,文件中包括机器代码、连接指令、外部引用以及从该源文件中产生的函数和数据名。(4)连接程序将所有的目标代码和用到的静态连接库的代
16、码连接起来,为所有的外部变量和函数找到其提供地点,(5)最后生成一个可执行文件。一般有一个makefile文件来协调各个部分产生可执行文件。1.4 程序举例【实例1】使用面向对象的设计方法,编写一个满足如下要求的程序:()根据输入的日期输出这一日期的前一天和后一天的日期。()根据输出的日期判断是星期几。#include using namespace std;struct Date int month;int day;int year;class TdateType public:TdateType();/不带参数的构造函数定义 TdateType(Date b);/有参数的构造函数定义 vo
17、id Next();/明天的日期成员函数定义 void Previons();/昨天的日期成员函数定义 int Weekday();/判断是星期几成员函数定义 void Print();/打印日期 private:Date a;/日期结构数据成员 int IsLeapYear();/私有成员函数,判断是否闰年 int MonthEnd(int m);/计算某月的天数;/以下为类的成员函数实现部分 TdateType:TdateType()a.year=1999;a.month=1;a.day=1;TdateType:TdateType(Date b)a.month=b.month;a.day=
18、b.day;a.year=b.year;void TdateType:Next()a.day+;if(a.day MonthEnd(a.month)a.day=1;a.month+;if(a.month 12)a.month =1;a.year+;void TdateType:Previons()a.day-;if(a.day 1)a.month-;if(a.month 1)a.month=12;a.year-;a.day=MonthEnd(a.month);int TdateType:IsLeapYear()return(a.year%4=0&a.year%100!=0)|(a.year%4
19、00=0);int TdateType:MonthEnd(int m)switch(m)case 1:case 3:case 5:case 7:case 8:case 10:case 12:return 31;case 4:case 6:case 9:case 11:return 30;case 2:if(IsLeapYear()return 29;else return 28;return 0;int TdateType:Weekday()long n;n=(a.year)-1)*365;/直至去年的天数(不考虑闰年)n+=(a.year)-1)/4;/以下3条语句考虑闰年数 n-=(a.y
20、ear)-1)/100;n+=(a.year)-1)/400;for(int i=1;ia.month;i+)/本年直至上月的天数 n+=MonthEnd(i);n+=a.day;/本月的天数 n%=7;/折算成星期几,若j是0,则为星期日 return n;void TdateType:Print()cout a.year年 a.month月 a.day日;switch(Weekday()case 0:cout星期日n;break;case 1:cout星期一n;break;case 2:cout星期二n;break;case 3:cout星期三n;break;case 4:cout星期四n
21、;break;case 5:cout星期五n;break;case 6:cout星期六n;break;int main()Date date;cout请输入日期(格式为:年月日,中间用空格隔开):date.yeardate.monthdate.day;TdateType Getdata(date);/根据输入的日期来创建并初始化对象 Getdata.Weekday();Getdata.Print();cout昨天是:endl;Getdata.Previons();Getdata.Weekday();Getdata.Print();cout明天是:endl;Getdata.Next();Getd
22、ata.Weekday();Getdata.Print();return 0;C+程序中,数据成员也叫字段,数据成员也叫方法。如果使用的是Microsoft Visual Studio 2005或以上的开发环境,可以从类图中看到类与数据成员的相互关系,如图1-2所示。图1-2 程序的类图表示1.5本章小结 本章介绍了面向对象程序设计的概念,面向对象程序设计(oop),指一种程序设计范型,同时也是一种程序开发的方法论。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。这种范型的主要特征是:程序=对象+消息。面向对象程序的基本元素是对象.面向对象程序的主要结构特
23、点是:第一,程序一般由类的定义和类的使用两部分组成,在程序中定义各对象并规定它们之间传递消息的规律。第二,程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法来完成相应得操作。对象、对象的状态和行为、类、类的结构、消息和方法是面向对象程序设计中出现的几个基本概念。面向对象程序设计的四大特征是:抽象性、封装性、继承性和多态性。传统的程序设计方法存在下面几点局限性。面向对象程序设计的优点。习题一 一、填空题 1面向对象程序设计,指一种_,同时也是一种程序开发的方法论。它将_作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、_和扩展性。2对象之间进行通信的结构叫
24、做_。3面向对象程序设计的四大特征是:_、_、_和_。4面向对象的程序设计中最为强大的功能是_,它允许用户在一个已经存在的类之上编写新的程序。5Smalltalk是第一个真正的面向对象程序设计语言,它体现了纯粹的OOP设计思想,是最纯的OOP语言,它起源于_语言。JAVA语言是一种适用于分布式计算的新型面向对象程序设计语言,可以看作是_语言的派生。二、选择题 1面向对象程序的基本元素是()。A 对象 B 方法 C 类 D 程序 2()是面向对象系统中实现对象间的通信和请求任务的操作,是要求某个对象执行其中某个功能操作的规格说明。A 语言 B 类 C 方法 D 消息 3Java语言中的(),主要
25、是通过对象和类来实现的,即把相关的数据及其操作封装在类里,构成具有独立意义的构件。A 抽象 B 继承 C 封装 D 多态 4在软件开发中,类的()使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的可重性。A 抽象性 B 继承性 C 封装性 D 多态性 5()语言的来源是Algol60的面向对象的扩展,但它是作为模拟语言设计的。它具有面向对象语言的功能和某些面向对象的方法学。A C+B Simula Smalltalk D Java 三、简答题 1 什么是面向对象程序设计?2 简述面向对象程序设计的基本概念和特征。3 传统的程序设计
26、具有哪些局限性?4 面向对象程序设计的优点是什么?5 试说出几种典型的面向对象程序设计语言,并对其进行简单的说明。C+面向对象程序设计第二章本章导读 C+语言是在C语言的基础上发展而来的,它比C语言更容易被人们学习和掌握。C+语言对C语言的扩充,主要是引进了面向对象机制,包括类、对象、派生类、继承、多态等概念和新的语言机制,从而使C+成为一种面向对象的程序设计语言。应该说明的是C+语言并没有完全抛弃C语言的成份,C+的面向对象和面向过程的双重特性是区别于其它面向对象语言的一个显著标志。本章要点 C+的特点 C+程序的基本结构 C+和C语言的区别第2章 目录 2.1 C+语言的产生和发展 2.2
27、 C+程序的结构及编程环境 2.3 C+的数据类型 2.4 运算符、表达式和基本语句 2.5 函数 2.6 作用域和引用 2.7 程序举例 2.8本章小结 习题二2.1 C+语言的产生和发展 2.1.1 C+的产生 2.1.2 C+的特点2.1.1 C+的产生 C+程序设计语言由C语言发展而来。C语言产生以后,最早在UNIX操作系统上使用,并且迅速被人们接受并得到了广泛的应用。到了80年代C语言已经风靡全球,成为一种应用最为广泛的程序设计语言。但C语言在盛行的时候也显现出了自己的局限性,突出表现在以下几个方面:()C语言类型检查机制较弱,这使得程序中的一些错误不能在编译时被发现。()C语言本身
28、几乎没有支持代码的重用机制,这使得各个程序的代码很难为其他程序所用。()C语言不适合开发大型的程序,当程序达到一定的规模时,程序员很难控制程序的复杂性。为了避免C语言以上的这些不足之处,1980年贝尔实验室的Bjarne Stroustrup博士开始对C语言进行改编。虚函数(virtual function)、运算符重载(operator overloading)、多重继承(multiple inheritance)、模板(template)、异常(exception)、RTTI、名字空间(name space)逐渐被加入标准,1983年正式命名新的语言为C+语言。1998年国际标准组织(IS
29、O)颁布了C+程序设计语言的国际标准ISO/IEC 14882-1998。C+是具有国际标准的编程语言,通常称作ANSI/ISO C+。C+继承了C的原有精髓,增加了对开发大型软件非常有效的面向对象机制,并且弥补了C语言不支持代码重用的不足,成为一种既可表现过程模型,又可表现对象模型的优秀的程序设计语言之一。目前C+仍在不断的发展当中。2.1.2 C+的特点()兼容C语言。这主要表现在大部分C程序不需修改即可在C+的编译环境下运行,用C语言编写的许多库函数和应用软件都可用于C+。()用C+编写的程序可读性更好,代码结构更合理,可直接地在程序中映射问题空间的结构。()生成的代码质量高,运行效率仅
30、比汇编语言代码段慢10%20%。()从开发时间、费用到形成的软件的可重用性、可扩充性、可维护性和可靠性等方面有了很大的提高,使得大中型的程序开发项目变得容易得多。()C+是面向对象的程序设计语言,可方便地构造出模拟现实问题的实体和操作。2.2 C+程序的结构及编程环境 2.2.1 C+程序基本格式 2.2.2 C+程序的结构 2.2.3 C+程序的编程环境2.2.1 C+程序基本格式 让我们通过程序2.1的学习,对C+程序的格式有一个初步的认识。【例2.1】#include using namespace std;int max(int x,int y);void main()/主函数 int
31、 a,b,fmax;/定义三个整型变量coutab;/从键盘输入变量a和b的值fmax=max(a,b);/调用函数max,将得到的值赋给变量fmaxcoutThe larger number:fmaxy)return x;else return y;由上面程序可以看出C+程序有以下几个基本组成部分:1预处理命令 2输入和输出 3函数 4注释2.2.2 C+程序的结构 一个面向对象的C+程序一般由类的声明和类的使用两大部分组成。类的使用部分一般由主函数及有关子函数组成。其结构大致如下:#include/类的声明部分 class A int x,y,z;/类A的数据成员的声名 fun()/类A的
32、成员函数的定义和声明 ;/类的使用部分 int main()A a;/创建一个类A的对象a fun();/调用成员函数fun()return 0;在应用程序中,我们常常把类的成员函数的定义与声明分开。分开后的定义和声明还可以写在两个文件中,使用时只要用#include包含即可,所以我们说C+程序是多文件结构。2.2.3 C+程序的编程环境 在DOS下,C+程序的编辑、编译和运行方法和过程与C语言基本一样,特别是常用的C+版本,如Turbo C+或Borland C+都带有C和C+两种编译器。在Windows下,我们常用Visual C+开发环境,来编辑、编译和运行C+程序,随着.NET的出现,
33、有时也用Microsoft Visual Studio 2005或Microsoft Visual Studio 2008来编辑、编译和运行C+程序。2.3 C+的数据类型 2.3.1 关键字和标识符 2.3.2 C+的基本数据类型 2.3.3 常量 2.3.4 变量 2.3.5 数组 2.3.6 结构体 2.3.7联合体 2.3.8 枚举类型 2.3.9 用typedef类型 2.3.10数据类型转换 基本数据类型(是系统预先定义的,并被 内设在语言中的数据类型)派生类型(派生类型是从基本类型派生出 来的新类型,它是一种更高级的抽象)类类型(类类型是通过组合现存类型而生 成的新类型)2.3.
34、1 关键字和标识符 在C+语言中,关键字(keyword)又称为保留字,它是系统预先定义的、具有特定含义的标识符,因此不允许用户重新定义,即不能作为新的标识符出现在程序中,例如:例2.1中的“cin”、“cout”和“return”等等。标识符是由若干个字符组成的字符序列,用来命名程序中的一些实体。通常用于常量名、变量名、函数名、类名、结构名、联合名、对象名、类型名和标号名等。在程序中用户是通过标识符来定义和引用这些对象的。C+语言中构成标识符的语法规则如下:(1)标识符由字母(az,AZ)、数字(09)或下划线(_)组成;(2)第一个字符必须是字母或下划线。例如,Example,My_Bir
35、thday,Message,是合法的标识符;5key,5-A是非法的标识符;(3)VC+中标识符最多由247个字符组成;(4)C+大小写字母被认为是两个不同的标识符。例如,book和Book被认为是两个不同的标识符;(5)关键字不能作为新的标识符在程序中使用,但标识符中可以包含关键字。例如,intx,myclass 是合法的标识符。下面列出了C+语言中的标点符号:,逗号,用做数据之间的分隔符;;分号,语句结束符;:冒号,语句标号结束符或条件运算符 单引号,字符常量标记符 双引号,字符串常量标记符 左花括号,复合语句开始标记符 右花括号,复合语句结束标记符2.3.2 C+的基本数据类型 整数类型
36、(int)/用于定义整数对象。字符类型(char)/字符类型用于定义字符数据。浮点类型(float,double)/浮点类型用于定义实数。空类型(void)/void类型主要用于声明没有返回值的函数,以及声明未确定类型或指向任意数据类型的指针。数据类型决定了数据所占存储空间的大小及值域范围,这些是与机器有关的。表2-1(见课本p14)列出的是在32位编译器中的基本数据类型所占空间的大小和值域范围。2.3.3 常量 特点 分类常量特点 常量是指在程序运行的整个过程中始终保持不变的量。在表达式中常量是明确表示出的值。常量不同于变量,主要表现在以下两个方面:第一,常量不在内存中占有编译空间;第二,常
37、量的值不能修改。常量分类 整型常量 字符常量 逻辑常量 枚举常量 实型常量 地址常量 字符串常量(一)整型常量 整型常量简称整数 它有十进制、八进制和十六进制三种表示。在整数末尾使用u和l字母1 十进制整数 当一个十进制整数大于等于-2147483648即-231-1,同时小于等于2147483647即231-1时,则被系统看作是int型常量;当在21474836484294967295即232-1范围之内时,则被看作是unsigned int型常量;当超过上述两个范围时,则无法用C+整数类型表示,只有把它用实数(即带小数点的数)表示才能够被有效地存储和处理。2 八进制整数 当一个八进制整数大
38、于等于0同时小于等于017777777777时,则称为int型常量,当大于等于020000000000同时小于等于037777777777时,则称为unsigned int型常量,超过上述两个范围的八进制整数则不要使用,因为没有相对应的C+整数类型。3 十六进制整数 当一个十六进制整数大于等于0同时小于等于0 x7FFFFFFF时,则称为int型常量,当大于等于0 x80000000同时小于等于0 xFFFFFFFF时,则称为unsigned int型常量,超过上述两个范围的十六进制整数没有相对应的C+整数类型,所以不能使用它们。4 在整数末尾使用u和l字母 对于任一种进制的整数,若后缀有字母
39、u(大、小写等效),则硬性规定它为一个无符号整型(unsigned int)数,若后缀有字母l(大、小写等效),则硬性规定它为一个长整型(long int)数。在一个整数的末尾,可以同时使用u和l,并且对排列无要求。如25U,0327UL,0 x3ffbL,648LU等都是整数,其类型依次为unsigned int,unsigned long int,long int和unsigned long int。(二)字符常量 字符常量简称字符,它以单引号作为起止标记,中间为一个或若干个字符。如a,%,n,012,125,x4F等都是合乎规定的字符常量。每个字符常量只表示一个字符,当字符常量的一对单引
40、号内多于一个字符时,则将按规定解释为一个字符。如a表示字符a,125解释为字符U。每个ASCII字符均是一个字符型数据,即字符型中的一个值。“转义”字符的概念,其含义是:以反斜线作引导的下一个字符失去了原来的含义,而转义为具有某种控制功能的字符。如n中的字符n通过前面使用的反斜线转义后就成为一个换行符,其ASCII码为10。(三)逻辑常量 逻辑常量是逻辑类型中的值,VC+用保留字bool表示逻辑类型,该类型只含有两个值,即整数0和1,用0表示逻辑假,用1表示逻辑真。在VC+中还定义了这两个逻辑值所对应的符号常量false和true,false的值为0,表示逻辑假,true的值为1,表示逻辑真。
41、(四)枚举常量 枚举常量是枚举类型中的值,即枚举值。枚举类型是一种用户定义的类型,只有用户在程序中定义它后才能被使用。用户通常利用枚举类型定义程序中需要使用的一组相关的符号常量。枚举类型的定义格式为:enum ;它是一条枚举类型定义语句,该语句以enum保留字开始,接着为枚举类型名,它是用户命名的一个标识符,以后就直接使用它表示该类型,枚举类型名后为该类型的定义体,它是由一对花括号和其中的枚举表所组成,枚举表为一组用逗号分开的由用户命名的符号常量,每个符号常量又称为枚举常量或枚举值。如:()enum colorred,yellow,blue;()enum daySun,Mon,Tues,Wed
42、,Thur,Fri,Sat;第一条语句定义了一个枚举类型color,用来表示颜色,它包含三个枚举值red,yellow和blue,分别代表红色、黄色和兰色。第二条语句定义了一个枚举类型day,用来表示日期,它包含7个枚举值,分别表示星期日、星期一至星期六。一种枚举类型被定义后,可以象整型等预定义类型一样使用在允许出现数据类型的任何地方。如可以利用它定义变量。()enum color c1,c2,c3;()enum day today,workday;()c1=red;()workday=Wed;(五)实型常量 简称实数,有十进制的定点和浮点两种表示方法。1定点表示 定点表示的实数简称定点数,它
43、是由一个符号(正号可以省略)后接若干个十进制数字和一个小数点所组成,这个小数点可以处在任何一个数字位之前或之后。如.12,1.2,12.,0.12,-12.40,+3.14,-.02037,-36.0等都是符合书写规定的定点数。2浮点表示 浮点表示的实数简称浮点数,它是由一个十进制整数或定点数后接一个字母e(大、小均可)和一个1至3位的十进制整数所组成,字母e之前的部分称为该浮点数的尾数,之后的部分成为该浮点数的指数,该浮点数的值就是它的尾数乘以10的指数幂。如3.23E5,+3.25e-8,2E4,0.376E-15,1e-6,-6.04E+12,.43E0,96.e24等都是合乎规定的浮点
44、数,它们对应的数值分别为:3.25*105,3.25*10-8,20000,0.376*10-15,10-6,-6.04*1012,0.43,96*1024等。(六)地址常量 指针类型的值域是0232-1之间的所有整数,每一个整数代表内存空间中一个对应单元(若存在的话)的存储地址,每一个整数地址都不允许用户直接使用来访问内存,以防止用户对内存系统数据的有意或无意的破坏。但用户可以直接使用整数0作为地址常量,它是C+中唯一允许使用的地址常量,并称为空地址常量,它对应的符号常量为NULL,表示不代表任何地址,在iostream等头文件中有此常量的定义。(七)字符串常量 字符串常量简称字符串,是由一
45、对双引号括起来的零个或多个字符序列。例如:“This is a C+Program.n”/字符串常量 “td”/字符串常量 “20021222”/字符串常量 字符串中可以包含空格符、转义字符或其他字符。字符串常量不同于字符常量,两者是有区别的,主要表现在以下几个方面:(1)字符常量的标识符是单引号,字符串常量的标识符是双引号;(2)存储方式不同;例如:Program/字符串常量 m/字符串常量 m/字符常量 (3)字符串常量和字符常量所能进行的运算是不同的。例如:m+n 和 m+n 运算的结果是不同的。2.3.4 变量(一)变量定义语句(二)语句格式举例(三)语句执行过程(四)语句应用举例(五
46、)符号常量定义语句(六)使用#define命令定义符号常量(七)使用变量和常量的程序举例(一)变量定义语句 变量定义是通过变量定义语句实现的,该语句的一般格式为:=,;为已存在的一种数据类型,如short,int,long,char,bool,float,double等都是类型关键字,分别代表系统预定义的短整型、整型、长整型、字符型、逻辑型(又称布尔型)、单精度型和双精度型。对于用户自定义的类型,可从类型关键字中省略其保留字。如假定struct worker是用户自定义的一种结构类型,则前面的保留字struct可以省略。是用户定义的一个标识符,用来表示一个变量,该变量可以通过后面的可选项赋予一
47、个值,称为给变量赋初值 是一个表达式,它的值就是赋予变量的初值。该语句格式后面使用的省略号表示在一条语句中可以定义多个变量,但各变量定义之间必须用逗号分开。(二)语句格式举例()int a,b;()char ch1=a,ch2=A;()int x=a+2*b;()double d1,d2=0.0,d3=3.14159;第一条语句定义了两个整型变量a和b;第二条语句定义了两个字符变量ch1和ch2,并被分别赋初值为字符a和A;第三条语句定义了一个整型变量x,并赋予表达式a+2*b的值作为初值;第四条语句定义了三个双精度变量,分别为d1,d2和d3,其中d2被赋予初值0.0,d3被赋予初值3.14
48、159。(三)语句执行过程 当程序执行到一条变量定义语句时,首先为所定义的每个变量在内存中分配与类型长度相同的存储单元,如对每个整型变量分配4个字节的存储单元,对每个双精度变量分配8个字节的存储单元;接着若变量名后带有可选项,则计算出初值表达式的值,并把它保存到变量所对应的存储单元中,表示给变量赋初值,若变量名后不带有可选项,则当所属语句处于函数之外时,将自动给变量赋予初值0,否则不赋予任何值,此时的变量值是不确定的,实际上是存储单元中的原有值(现在被称为垃圾)。(四)语句应用举例【例2.2】计算圆的周长和面积。分析:计算圆的周长和面积,则圆的半径、周长和面积都需要设定为变量,假定分别用rad
49、ius,girth和area标识符表示,它们的类型均应为实数型,即单精度或双精度型,通常使用双精度型。根据圆的半径计算周长和面积的公式为:girth=2radius area=radiusradius 下面给出用C+语言编写的程序:#include using namespace std;void main()double radius,girth,area;/定义变量 cinradius;/从键盘输入一个圆的半径 girth=2*3.14159*radius;/计算周长 area=3.14159*radius*radius;/计算面积 coutradius:radiusendl;coutgi
50、rth:girthendl;coutarea:areaendl;在这个程序的主函数中,第一条语句定义了三个变量,由于没有给它们赋初值,所以其值是不确定的;第二条语句从键盘输入一个常数给半径radius,输入的常数可以是整数,也可以是定点数或浮点数,系统将自动把它转换为一个双精度数后再赋给radius,即赋给该变量所对应的存储单元;第三条和第四条语句分别计算出赋值号右边表达式的值,再分别赋给变量girth和area;第五至七条语句依次向屏幕输出圆的半径、周长和面积。(五)符号常量定义语句 符号常量定义语句同变量定义语句类似,其语句格式为:const =,;该语句以保留字const开始并标识,后跟