1、第九章 类与对象91 类的定义92 对象的创建93 对象的初始化94 使用类与对象构造程序的举例95 关于类与对象的进一步的讨论第九章 类与对象要点:类、对象、构造函数、析构函数要求:掌握类与对象的概念,理解类与对象的关系;了解对象的创建方法及初始化;91 类的定义911 什么是类类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。类是一种复杂的数据类型,它是将不同类型的数据和与这些数据相关的运算封装在一起的集合体。类的结构是用来确定一类对象的行为,它们是通过类的内部数据结构和相关的运算来确定的。这些行为是通过一种运算接口来描述
2、的,使用者关心的只是接口的功能,对实现过程并不感兴趣。利用类可以实现数据的封装、隐藏、继承与派生。912 类的定义格式类的定义格式一般分为说明部分和实现部分。其一般定义格式如下:classpublic:;private:;;其中,class 是定义类的关键字。是一种标识符,花括号内是类的说明部分,说明该类的成员。类的成员包含数据成员和成员函数两部分。从访问权限上来份,类的成员又分为:公有的(public) 、私有的(private)和保护的(protected)三类。公有的数据成员可以被程序中任何代码访问;私有的数据成员只能被类本身的成员函数及友元类的成员函数访问,其他类的成员函数,包括其派生
3、类的成员函数都不能访问它们;保护的数据成员与私有数据成员类似,只是除了类本身的成员函数和说明为友元类的成员函数可以访问保护成员外,该类的派生类的成员函数也可以访问。下面举例说明如何定义一个类:class Aprivate:int i;protected;int j;public:int k;int geti()return i;int getj()return j;int getk()return k;本例的成员函数都是在类体中实现的。若在类体外实现,则要使用作用域运算符:,其使用格式如下: ()例如,上例还可写成:class Aprivate:int i;protected;int j;pu
4、blic:int k;int geti();int getj();int getk();int A: geti()return i;int A: getj()return j;int A: getk()return k;注意事项:定义类时需要注意: 在类体中不允许对所定义的数据成员进行初始化。 类中的数据成员的类型可以是任意的,包括整型、浮点型、字符型、数组、指针和引用等。也可以是对象。92 对象的创建在程序中定义对象的语法和定义变量相同。对象是类的实例,定义对象之前一定要先说明该对象的类。921 对象的定义格式在说明类以后,定义其对象的格式如下:其中, 中可以有一个或多个对象名。当有多个对象
5、名时,用逗号分隔。中还可以时指向对象的指针名或引用名,也可以是对象数组名。例如,定义 A 类的三个对象可以如下:A a1,a2,*p;922 对象成员的表示方法一个对象的成员就是该对象的类所定义的成员。对象成员有数据成员和成员函数,一般对象的成员表示如下:. 或者 .()前者用来表示数据成员,后者用来表示成员函数。例如,A 类的 a1 对象的 i 成员、j成员、k 成员可表示为:a1.i, a1.j, a1.kA 类的 a1 对象的成员函数 geti()可表示为:a1.geti()指向对象的指针的成员表示如下:- 或者 -()- 与( * )-两种表示是等价的。例如,a1 的成员可表示为:a1
6、-i, a1-j, a1-k 或者 (*a1).i, (*a1).j, (*a1).k其成员函数 geti()可表示为:a1- geti() 或者(*a1). geti()例:#include class scoreprivate:float average;public:void newscore(float avg)average=avg;void printscore()cout#include class COUNTint num; /默认为私有变量public:COUNT(); /构造函数COUNT(); /析构函数void process();COUNT:COUNT() /构造函数
7、的实现num=0;COUNT:COUNT() /析构函数的实现coutget(); /get()为类 Point 的成员函数需要注意的是,如果类 A 没有定义构造函数 A:A(),则编译系统会自动生成一个不带参数的默认的构造函数::()同样,如果类 A 没有定义析构函数 A:A(),则编译系统会自动生成一个默认的析构函数::()拷贝初始化构造函数拷贝初始化构造函数是一种特殊的成员函数,它的功能是用一个已知的对象来初始化一个被创建的同类的对象。拷贝初始化构造函数实际上也是构造函数,它是在初始化时被用来将一个已知对象的数据成员的值拷贝给正在创建的另一个同类的对象。拷贝初始化函数的特点如下:1 该函
8、数名同类名,因为它也是一种构造函数,并且该函数也不被指定返回类型。2 该函数只有一个参数,并且是对某个对象的引用。3 每个类都必须有一个拷贝初始化函数,其格式如下所示::(const public:TAdd(int a,int b)x=a;y=b;coutclass Tcprivate:double unlead,lead,total;int unprice,price; /单价public:Tc () unprice=17;price=16;Void getdata()coutunlead;coutlead;total=unprice*unlead+price*lead;void disp(
9、)coutclass Cfactorialint value;int fact;public:Cfactorial(int val);void CalculateFactorial();void Display();Cfactorial: Cfactorial(int val) /构造函数定义value=val;fact=1;void Cfactorial:CalculateFactorial() /构造函数定义int i=value;while(i1)fact*=i-;void Cfactorial:Display()coutvalue “!=”factendl;void main()Cfa
10、ctorial A(6);A.CalculateFactorial();A.Display();本程序的执行结果如下:6!=72095 关于类与对象的进一步的讨论951 基本数据类型与对象在一些面向对象程序设计语言中,系统提供给程序员使用的基本数据类型也是以类的形式提供的,然而在 C+这类混合型面向对象程序设计语言中,基本数据类型是独立处理的。虽然从形式上看,由 int 声明的变量 i 与由类类型 Tadd 声明的对象 p1 有所不同,但从本质上看,基本数据类型声明的变量与对象是相同的,我们可以将这些变量也理解为对象,其属性即是变量的值,其操作即是 C+提供的基本操作。类类型声明的对象初始化形
11、式为:TAdd p1(4,5);而基本数据类型的对象初始化形式为:int i=5;为使基本数据类型的对象用法更接近于用户自定义的类类型对象,C+语言的新版本提供了一种新的初始化方法:int i(5);952 抽象数据类型类是构造面向对象程序的基本单位,面向对象程序设计的主要任务就是设计类并利用类组装程序。一个面向对象程序是由一组相关的类组成的。在 C+语言中还必须提供一个主函数 main( )。从本章的讨论我们可以看出,类是关于一组结构与行为相似的对象的共同特性的描述。然而类与对象是两个不同的概念:类是面向对象程序静态文本中的概念,而对象则是面向对象程序动态运行时的概念。区别这两个概念对正确理
12、解面向对象程序有重要意义。类是一组相似对象的抽象描述,尽管各个对象的内部状态是不同的,但类摒弃了这些差异,抽取出这些对象的共性组成一个共同的概念。与此类似,在类之上还有一个抽象描述,我们称之为抽象数据类型(Abstract Data Type,简称 ADT) ,ADT 是一组相似类的抽象描述,而一个类是 ADT 的具体实现。953 设计良好的类界面我们在设计一个类的界面时应该至少从三方面作平价:(1)界面应该具有完备性类界面提供的服务应该是完整的。类作为一个封装体供其它类使用。围绕类的内部数据组织的操作应该是比较齐备的。否则在一些情况下就无法满足其它类的重用需求。例如银行帐户类 ACCOUNT
13、 除了存款与取款操作外,还应包括新开帐户、撤销帐户、查询当前帐户余额、修改户主信息等操作。 (2)类界面应该是无二义的类界面提供的服务应该具有无二义性。我们设计的操作名字应该是有意义的,并且操作提供的服务也应该简单、容易理解。不同的操作之间注意不要产生矛盾。 (3)类界面应该是无冗余的类界面提供的服务应该避免重复,即一个操作应该是原始的,它无法用其他操作来实现。在实现时我们可以引入一些辅助操作,但这些操作应该封装在这个类中,不提供给外部使用。当然,我们有时也会为提高效率或方便使用而引入一些非原始的操作。954 再论对象“对象”是一个被广泛使用的词语,在各种领域中有不同的含义。一般说来,任何事物
14、均可看作对象,当我们要考察并研究事物的某些属性与行为时,它们就成为我们有意义的对象。例如,我们要处理的现实世界或思维世界中的实体就是一种对象。从不同的角度出发,我们可能会将对象看作是不同的概念。通过这些不同角度,我们可以加深对象这一概念的理解。(1)对象是实体在计算机中的模拟从宏观上看,对象用来模拟现实世界或思维世界中的实体,模拟的重点是实体中的信息处理与实体之间信息的传递。实体的信息处理过程由对象内部状态的变化来模拟,而实体之间的信息传递则由对象之间的通信来模拟。(2)对象是属性与行为的封装单位从微观上看,对象由一组数据及其上的操组组成。对象虽然是一个封装体,但对象之间可以进行通信,即一个对
15、象能接收并处理从其他对象传递来的信息,也可向其他对象传递信息。在 C+语言中,对象之间的通信是通过调用其他对象的成员函数实现的。(3)对象作为具有输入/输出的有限自动机从形式上看,对象是一个通信自动机。一个自动机可以和其他自动机进行通信,即以其他自动机的输出作为自己的输入,自己的输出作为其他自动机的输入。作为一个自动机,对象具有独立的计算能力,这表现在对象具有自己的内部状态以及状态转换机制。一个面向对象程序中的对象大致可分为两类:一类是面向应用领域的对象,它们对应于应用环境中的外部实体;一类是面向计算机领域的对象,它们对应于与计算机密切相关的实体。在一个会计电算化程序中,记帐凭证、分类帐册、会计报表等对象是应用领域对象,而对话窗口、列表浏览器、打印机配置等对象则是计算机领域对象。通常,应用领域对象是千变万化的,不同应用领域的对象相差甚远,但计算机领域的对象则比较清晰。易于组织为可重用的形式。