您好,欢迎访问三七文档
《C++语言教程》刘强地表空间信息研究所主楼中418室电话:83203302第一章引论•C++语言是一个面向对象语言,它所支持的面向对象的概念容易将问题空间直接映射到程序空间,为程序员提供了一种与传统结构程序设计十分不同的思维方式。•因此,学习C++语言面临两个问题,如何建立面向对象的思维方式?如何用C++语言编程?亦即需要学习面向对象的设计方法和使用C++语言的编程方法。1.1面向对象的目标•传统的程序设计方法是模块化(或结构化)的程序设计方法,步骤为:•(1)整个软件系统功能逐步细化为多个小的功能—功能划分;•(2)多个小的功能对应由一个模块(如函数,过程,分程序,子程序等)来实现;•(3)多个模块合作完成较大的功能,所有模块的合作完成整个软件系统的功能。•对于传统的程序设计,在设计和实现(编程)阶段考虑的是模块,程序本身也是由模块构成的,称之为面向模块(面向过程)。面向对象的目标归纳为:对试图利用计算机进行问题求解和信息处理的领域,尽量使用对象的概念,将问题空间中的现实模型映射到程序空间,由此所得到的自然性可望克服软件系统的复杂性,从而得到问题求解和信息处理的更高性能。1.2面向对象语言的核心概念•数据类型是一个抽象的概念,包含有一组数据的定义和一组对该组数据操作的定义。数据类型分为三种:简单数据类型,用户定义数据类型,抽象数据类型。•简单数据类型:语言本身提供的,如整型,包含有所有的整数和对整数的操作,对于一个整数的成分(二进制表示)是不可见的,也不可直接操作。内部类型•基本类型:char,int,float,void•派生类型:格式:类型修饰符基本类型–类型修饰符:short,long,singed,unsigned,double–例:long(int),double(float),longdouble(float),…•bool类型•用户定义数据类型:以简单数据类型为基础,它包含的数据成分是多个简单数据类型的数据,可以对数据成分进行直接操作。自定义类型•使用typedef–格式:typedef已声明的类型新类型名–例如:typedefunsignedcharUCHARtypedefunsignedlongDWORD•枚举类型–格式:enum枚举类型名{枚举值表}[枚举变量表];–例:enumweekday{MON=1,TUR,WED,THU,FRI,SAT,SUN}nowday,oldday;•class,struct,union•在高级程序设计语言的程序中,对于简单的和用户定义数据类型,数据的定义和操作是分开的,只是在对数据进行操作时,需检查该操作是否符合对应的类型允许的操作(即类型检查)。•对于类型的使用,必须通过类型的实际例子(简称实例或实体,即原来所说的变量或常量)的使用来体现。例如:intnum;•抽象数据类型:在定义数据时,必须同时定义对数据的操作;它的成分(简单的或用户定义的数据类型的数据)是不可见的,也不可直接操作,必须通过类型提供的操作进行访问。•面向对象语言中的对象是“将某组数据和使用该组数据的一组基本操作或过程封装在一起,而成的一个实体”。实际上就是抽象数据类型的一个实例。•对象和抽象数据类型的关系,就像整型变量和整型数据类型的关系。•作为克服软件复杂性的手段,在面向对象中,利用了如下对象的性质:•(1)将密切相关的数据和操作封装起来定义为一个实体。•(2)定义了一个实体后,即使不知道此实体的功能是怎样实现的,也能使用它们(这一点类似于库函数)。1.2.1数据封装•面向对象的程序设计语言,最核心的概念是数据封装、继承性和多态性。•抽象是指对于一个系统的简化描述。对于使用系统的人员,不会去关心该系统的组成和工作的原理;他们所关心的是该系统具有什么样的功能,如何去使用该系统(既系统提供什么样的接口,让人们使用)。•抽象的原则,运用在计算机领域,称之为“信息隐蔽”原则;在面向对象的程序设计语言中,使用数据封装机制实现信息隐蔽。•数据封装将一组数据和与这组数据有关的操作集合封装在一起,形成一个能动的实体,称为对象。•用户不必知道对象行为的实现细节,只需根据对象提供的外部特性接口访问对象。•例classCircle{floatr;//半径intx,y;//圆心关于半径、圆心和圆的操作;};•类的概念将一组数据和这组数据有关的操作集合封装在一起,建立了一个定义良好的接口,人们只关心其使用,不关心其实现细节。这反应了抽象数据类型的思想。•类本身还是一组对象共同属性和操作的抽象。类代表了一般性,而该类的每一个对象代表了具体性。1.2.2继承•继承是面向对象语言的另一个重要的概念。在客观世界中,存在着整体和部分的关系(apartof)、一般和特殊的关系(isa或akindof),实现了重用性和扩充性。•AisapartofB.•AisakindofB.•例:人与学生的关系(继承)点与圆(心)的关系(包含)点与多边形(顶点)的关系•将一个人当成对象,对于人的定义(如名字、年龄、性别等等)和对人的操作(取名字、打印一个人的各种信息等等)已经封装在Person类中了;下面将学生当成对象,学生是一类特殊的人,基本的信息和操作已经Person中定义过了,为了避免重复定义C++允许用户将学生类Student说明为Person类的继承类。personstudent•这样,Student类就可以不必在考虑对于人的基本信息的定义和操作了,继承机制允许学生类从人类中继承人的所有数据和操作,学生类只需要考虑学生特殊的信息的定义和对学生本身的操作即可。1.2.3多态性面向对象另外一个核心概念是多态性。所谓多态,是指一个名字(或符号)具有多种含义。利用超载(或称为重载overload)方式实现多态性。有函数和运算符超载。函数的名字有两个作用:1)代表了该函数的函数体(那段代码);2)代表了该函数的功能。在传统的语言中,不允许函数有同名的情况,考虑的是函数名的第一个作用;而在面向对象的程序设计语言中,如果发现多个函数的功能是一致的,尽管他们确实是不同的函数,但允许它们具有相同的函数名字,即存在同名函数。•对于函数重载,若函数调用(界面)与哪一个函数体(函数实现)相匹配,是在编译时确定的,称为早期匹配(或静态联编)。如果函数调用与哪一个函数体的匹配是在运行时动态进行的,称之为晚期匹配(或动态联编)。•一般来说,早期匹配执行速度比较快,晚期匹配提供灵活性和高度的问题抽象。1.3按对象方式思维•面向对象的CRC方法从以下三个方面来表述对象。•⑴Classname(对象取名)对象取名实质上就是将系统的功能进行划分。•⑵Responsibilities(责任)每个对象只负责完成设计中的一个小目标的功能。•⑶Collaborators(合作者)每个对象可能会依赖其他对象来完成其责任。这个对象所依赖的对象集合称为它的合作者。•对象的合作关系有:包含、继承、友元、使用如何判定“是否已经找到合适的对象”,没有一定的准则。1.4面向对象的思想和方法•1.4.1面向对象是一种认知方法学•认知方法:从一般到特殊的演绎方法从特殊到一般的归纳方法。•面向对象提供了从一般到特殊的演绎手段,又提供了从特殊到一般的归纳形式,从而说明它是一种很好的认知方法。这种分类、归纳的方法在面向对象设计技术中是很重要的。1.4.2面向对象与软件IC•“软件IC”:一种软件集成机制,可以将已经成熟的软件单元制成一个相对独立的实体,使它们可以不加改动或很少改动就可以应用于新的软件系统中。“软件IC”是一种可重用模块。•类概念支持“软件IC”技术:•在面向对象语言中,类充当了系统构造的单元,这是因为它具有以下特点:•类是一类对象的统一模板,它具有很强的模块性。类的功能代码实现只通过外部接口与外界联系,具有很强的独立性。•类的可靠性表现在一个类的出错不会传播到其他类中,一个系统的类如果出错,可以将其删除,作为一个降级的系统使用,而不会使整个系统瘫痪。•类是对象一级的抽象,它将一类对象的数据结构和功能实现封装起来,使得外界不必清楚其内部实现,只要从它的说明中了解其基本功能就可以使用它。•类之间的连接只有继承性描述和一组外协消息,因而清晰、明了。1.4.3面向对象方法与结构程序设计方法•1.模块与对象•结构化程序设计中,模块是对功能的抽象。而对象是包括数据、操作的整体,将数据和功能的抽象和统一。可以说,对象包含了模块。•2.过程调用与消息传递•在结构化程序设计中,过程为一独立实体,显式地被它的使用者所见,而且,对于相同的输入参数,每一次过程调用,其输出结果是相同的。•在面向对象的程序设计中,对象是一台自动机,对象的状态只能由对象的操作改变它。C++语言用函数实现操作。每当需要改变状态的时候,只能由其他对象向该对象发送消息(在C++中,借助于成员函数调用来实现消息发送)。•对象响应消息后,按照消息模式找出匹配的操作,并执行该操作。应该注意,发送消息和过程调用的意义是不同的,发送消息只是触发自动机,同样的输入参数,可能因自动机状态不同,其输出结果也不同。1.4.4对象是抽象数据类型的实现•抽象是一个系统的简化描述,它强调了系统的某些特性而忽略了其他特性。对于用户来说,所关心的是程序能做什么,而不是它的实现细节。•而抽象恰好可以用来对用户所关心的重要信息予以强调,而忽略不重要的信息。•整个程序设计语言的发展过程就是抽象层次不断提高的过程。•抽象数据类型在程序中是一封闭的单位。它包含的信息有:外部可见的:处理数据的各个操作的界面外部不可见的:数据和操作的实现细节•于是,将数据类型抽象为提供给外部世界的数据和操作集。使用了抽象数据类型描述,不再关心数据结构是什么,而仅仅关心它具有些什么功能可用。这与信息隐藏原则很符合。1.6面向对象的程序设计语言•将面向对象的概念正式作为语言成分的是Simula67。Simula语言在ALGOL60语言的基础上发展起来,引入了类、对象、继承和共行子程序等概念。当今的面向对象程序设计的基本思想来源于Simula语言。•80年代以后,Smalltalk语言的问世标志着面向对象语言研究的开始。Smalltalk具有一个非常好的开发环境。•80年代早期,AT&T贝尔实验室的BjarneStroustrup及其研究小组将C扩展为C++——一个支持面向对象概念的C语言。当时开发C++是为了解决Simula67语言带来的效率方面的问题。•面向对象的概念和方法是当前软件开发中最接近问题的一种较好方法。
本文标题:C++语言教程
链接地址:https://www.777doc.com/doc-2904336 .html