第6章 类
- 格式:docx
- 大小:210.50 KB
- 文档页数:36
版本控制页 版本控制表 序号 版本号 版本性质 创建时间 建议人 修订人 修改日期 修改内容简述 备注
V0.00 初稿 10.16.2008 华伟 一审 10.29.2008 刘新华 二审 11.4.2008 郑砚 一校 孔祥萍 二校 2008.11.17 赵元 第6章 类 本章主要内容: 面向对象程序设计的概念 类和对象 构造函数和析构函数 类的静态成员和常量成员 友元类 运算符重载
本章重点: 类和对象 构造函数和析构函数
本章难点: 类的静态成员和常量成员 运算符重载
学完本章您将能够 掌握对象程序设计技术 掌握类和对象的概念 掌握类的静态成员和常量成员 了解友元类 掌握运算符重载 引言 面向对象程序设计方法(Object-Oriented Programming,简称OOP)是20世纪90年代开始流行的一种程序设计方法,它的出现使传统程序设计思想和设计方法发生了革命性变化。在程序设计中把功能模块抽象成一个个不同的类,再用这些类定义出一个个具体的对象,把现实世界中事物间的关系抽象成软件系统中对象间的关系。 C++语言是在C语言基础上融入面向对象技术而发展出来的计算机语言。掌握面向对象程序设计的思想是C++语言学习的重点,本章将开始对C++语言中面向对象程序设计方法的学习。
6.1 面向对象程序设计 面向对象程序设计的起源 传统的程序设计方法是一种面向过程的程序设计方法。过程式的程序设计是一种自上而下的设计方法,设计者用一个主函数概括出整个应用程序需要做的事,而主函数由一系列子函数的调用组成。对于主函数中的每一个子函数,又都可以再被精炼成更小的函数。重复这个过程,就可以完成一个过程式的设计。其特征是以函数为中心,用函数来作为划分程序的基本单位,数据在过程式设计中往往处于从属的位置。 过程式设计的优点是易于理解和掌握,这种逐步细化问题的设计方法和大多数人的思维方式比较接近。然而,过程式设计对于比较复杂的问题,或是在开发中需求变化比较多的时候,往往显得力不从心。这是因为过程式的设计是自上而下的,这要求设计者在一开始就要对需要解决的问题有一定的了解。在问题比较复杂的时候,要做到这一点会比较困难,而当开发中需求变化的时候,以前对问题的理解也许会变得不再适用。在过程式的程序设计,主函数依赖于其子函数,这些子函数又依赖于更小的子函数,越小的函数处理的往往是细节实现,这些具体的实现,又常常变化。这样的结果,就是程序的核心逻辑依赖于外延的细节,程序中本来应该是比较稳定的核心逻辑,也因为依赖于易变化的部分,而变得不稳定起来,一个细节上的小小改动,也有可能在依赖关系上引发一系列变动。这种程序设计方法不利于软件的维护与扩充。 面向对象程序设计是一种自下而上的程序设计方法。不像过程式设计那样一开始就要用主函数概括出整个程序,面向对象设计往往从问题的一部分着手,一点一点地构建出整个程序。面向对象设计以数据为中心,类作为表现数据的工具,是划分程序的基本单位。而函数 在面向对象设计中成为了类的接口。 面向对象设计自下而上的特性,允许开发者从问题的局部开始,在开发过程中逐步加深对系统的理解。这些新的理解以及开发中遇到的需求变化,都会再作用到系统开发本身,形成一种螺旋式的开发方式。 由于整个软件被看作是对象及其相互作用关系的组合,因而便于编程人员进行抽象思维,提高了软件的可重用性,可靠性和安全性。 面向对象程序设计技术是在传统程序设计方法的基础上经过长期的编程、实践逐步发展而来的。由于面向对象程序设计方法的以上优点,该方法已经在操作系统、数据库管理、作战模拟、计算机网络与通信、人机界面设计等方面获得了广泛的应用。
面向对象方法的概念 与面向对象程序设计相关的基本概念有类、对象、方法、属性、封装、继承、多态、重载等。 类是对现实实体的抽象,它包括数据和操作两部分。数据用于描述对象的性质、状态,操作则用于描述该对象的行为。对象则指的是类的具体实例。 方法,就是对象所能执行的操作,也就是类中所定义的服务。方法描述了对象执行操作的算法,在C++语言中把方法称为成员函数。 属性,就是类中所定义的数控,它是对客观世界实体所具有的特性的抽象。类的每个对象都有自己独有的属性值。在C++语言中把属性称为数据成员。 封装指的是对象的各种外部性质同其具体的内部实现相互分离。编程人员在进行软件设计时只需要知道有哪些外部性质(即接口),无需了解其内部细节,从而有助于编程人员将精力集中于所要求解的问题。 继承是派生新类的方法。通过继承,子类不仅具有父类的属性和方法,而且还具有自己独有的属性和方法。在软件设计中,继承的使用有助于提高软件的可维护性、可扩充性和可重用性。 多态性是指在一组具有继承关系的类层次中,同一个消息发给该类及该类的子类对象时,这些对象会作出不同的响应。多态性的使用不仅有助于编程人员进行抽象思维,而且还为该软件的扩充提供了极大的灵活性。 有两种类型的重载:函数重载和运算符重载。函数的重载在前面的章节中已经进行了详细的讲解。运算符重载是指同一个运算符可以施加于不同类型的操作数上面。当操作数特征 不同或被操作数的类型不同时,实现函数的算法或运算符的语义是不同的。 面向对象设计方法的基本步骤 目前有多种面向对象程序设计方法,不同的方法所采用的基本步骤也各不相同。总的来说,运用面向对象的程序设计方法进行软件设计,一般要经过系统分析、系统设计、对象设计、应用程序生成、软件的测试与维护等几个阶段。 系统分析阶段的主要任务是对系统进行对象分解,从中抽象出类及子类,并建立该系统对象模型。该阶段不涉及对象模型的具体细节,所建立的对象模型也与具体程序设计语言无关。 系统设计阶段的主要任务是确定目标系统问题的求解策略,包括系统划分为子系统以及各个子系统的硬件和软件资源配置等。该阶段的设计决定了整个软件的体系结构和设计风格。 对象设计阶段的主要任务是完成各个对象(类)的细节处理,包括内部数据结构表示、对象接口及其算法等。 应用程序生成阶段主要是根据对象间的相互作用关系,完成整个系统软件构造。在该阶段,编程要按照一定规则进行,软件要符合面向对象程序设计风格。 软件的测试与维护阶段的主要任务是保证软件的正确、可靠运行。
6.2 C++中类与对象的定义 6.2.1 类的概念和特征 数据的操作和处理封装在一个程序模块中的方法,可以说是人们几十年程序设计实践的经验总结。把程序以类的形式组织成若干模块,使其获得最佳的结构特性,类概念的引入使程序设计技术发生了革命性的转变。从结构程序设计中以函数作为程序的基本模块,转变为面向对象程序设计中以类作为程序的基本模块,这一变化使程序设计技术出现了质的飞跃。 类(class)的概念是面向对象程序设计的核心概念。类是对现实世界中客观事物的抽象,通常将众多的具有相同属性的事物归纳为某个类。面向对象方法中的类,是对具有相同属性和行为的同一类对象的抽象描述,其内部包括属性(本类的数据成员)和行为(本类的成员函数)两个主要部分,也就是说,类以数据为中心,把相关的一批函数组成为一体。 对象(object)的概念也是面向对象程序设计的核心概念。对象是基于类这种特殊的数据类型建立的一个变量。但它又不同于普通的简单变量,普通的简单变量只保存有数据的信 息,而没有提供对这些数据信息的操作方法。而对象这种特殊的变量则不仅保存有数据,而且可以是保存大量而复杂的数据信息,同时还提供了对这些数据的操作方法。使程序中对数据的修改和操作变得更直观,更方便和更安全。 类的使用大致有以下6个优点: 1) 使程序设计本身更有条理; 2) 程序的可读性更好; 3) 程序设计的过程真正像是机器部件的组装; 4) 使程序由多个程序员设计变得方便和自然; 5) 由于程序的零部件化,使得程序的可重用性变成切实可行的事情; 6) 引入了类(class)和对象(object)的概念,就使得C++语言与C 语言相比发生了本质的变化。 类和对象的概念在C++编程中所起的作用,可以从以下两个角度来分析: 1) 从程序的组织角度,C++通过类把数据以及对这些数据进行处理和运算的函数封装为互相关联的程序模块。 2) 从数据类型的角度,C++通过类引入了抽象数据类型的概念,一个由数据成员和函数成员组成的类就是一种新的数据类型。C++语言为用户提供了设计反映不同应用背景特征的千变万化的数据类型的可能性。
6.2.2 类的定义 C++的类是在结构体的基础上扩充而来的,在C++语言中,结构体可以被作为一个公有属性的类使用。类是把各种不同类型的数据和对数据的操作组织在一起而形成的用户自定义的数据类型。 C++中,类定义包括类说明和类实现两大部分。说明部分提供了对该类所有数据成员和成员函数的描述,而实现部分提供了所有成员函数的实现代码。 一个类定义的常用格式为: class 类名 { private: // 私有 数据成员或成员函数 protected: // 保护 数据成员或成员函数 public: // 共有 数据成员或成员函数 }; 大致有以下7点需要注意: 1) class是定义类的关键字,类名由用户自己定义,必须是C++的有效标识符,但一般首字母大写; 2) 大括号内的部分是类的成员(数据成员和函数成员),它们分成3部分,分别由public、private、protected这3个关键字后跟冒号来指定。这3部分可以以任何顺序出现,且在一个类的定义中,这3部分并非必须同时出现; 3) 如果数据成员或成员函数在类的private部分,那么在类之外是不能调用的,只有类中的成员函数才能调用private的数据成员和成员函数; 4) 在一个类的public部分说明的数据成员或成员函数可被程序中的任何函数或语句调用,public成员多为成员函数,用来提供一个与外界的接口,外界只有通过这个接口才可以实现对private成员的存取; 5) 在类的protected部分说明的数据成员和成员函数是不能在类之外调用的,只有类的成员函数及其子类(派生类)可以存取protected的成员; 6) 定义类时,当未指明成员是哪部分时,默认是属于private成员,但一般不要采用默认形式; 7) 要特别注意,在类的定义中,类的说明部分的右边大括号后面必须有一个“;”。 定义一个只有私有成员变量的英雄类,例如: class CHero // 英雄类 { private: int m_nHP; int m_nMP; };
6.2.3 成员函数的定义 类中的成员函数可以在以下两处定义: