对象和类的理解

什么是对象
程序中的对象是对现实对象的抽象。现实中的对象包括可感知的物体以及思维中的概念。例如,天鹅、闹钟、飞机等各种物体可以看做一个个的对象,学校、公司、家庭等概念也可以看做一个个的对象。现实对象有一个特点,即它是具有属性和行为的整体。例如一个闹钟具有当前时间刻度、预定时间等“属性”,并具有指示时间、响铃等“行为”;而学校则具有学生、教师等“属性”,并具有招生、教育等“行为”。在程序中,属性可以抽象成数据,而行为可以抽象成函数,一个数据和函数的集合就构成了一个对象。
提示
程序中的对象是一个整体,其属性和行为不可分离。要访问对象的属性(数据)和行为(函数)只能通过对象进行。例如要查看闹钟的“当前时间”或“预定时间”,只能通过闹钟这个对象进行,指示时间和响铃也只能通过闹钟进行。由此带来的一个好处是可以对相关的数据和函数按照需要分类管理,从而提高程序代码的可读性,以及软件的可维护性。
例如,在程序中表示一个闹钟对象,可以先定义一个表示时间的结构体Time(其成员可以是三个整数,分别表示时、分、秒),然后用Time的两个变量分别表示“当前时间”和“预定时间”属性。对于“指示时间”和“到时响铃”两种行为,可以分别用两个函数表示,如图12-1所示,左图是现实中的闹钟对象,右图是程序中的闹钟对象。
什么是类
无论是在现实世界中,还是在程序中,对象都是一个完整的个体,而这些个体都可以按照某种规则进行分类。例如一个闹钟就属于闹钟类,一个三角形就属于三角形类。分类的规则是对象的属性相同(数量相同,类型也相同),行为也相同。
例如所有闹钟都具有形状、当前时间、预定时间等属性。这些属性的个数相同,不同闹钟的相同属性的类型也相同。另外,所有闹钟都具有指示当前时间、到时响铃等行为。因此,所有的闹钟都可以归为闹钟类,如图12-2所示。
 
说明
同一类的不同对象是靠属性值区别的。例如在图12.2中,各个闹钟的“形状”属性互不相同,当前时间和预定时间属性值也都不尽相同,由此可以区分不同的闹钟对象。如果同一类的两个对象的属性值完全相同,则两个对象就是相同(相等)的。
为了在程序中表示一个对象,应当采用一种特殊的数据结构来集成数据和函数。在C语言中结构体虽然可以用来集成数据,但不能用来集成函数。所以C++语言采用了特殊的数据结构类(class)来集成数据和函数,而类的变量就是对象。同结构体一样,类也是可以自定义的,即开发者可以设置类中包含的数据以及函数。例如,一个闹钟类的定义如下:
class AlarmClock
{
public:
    void  showCurTime();                   // 显示当前时间
    void  setAlarmTime( Time alarmTime );  // 设定响铃时间
    void  alarm();                         // 响铃
private:
    int  m_shape;                          // 闹钟的形状编号
    Time  m_curTime;                       // 当前时间
    Time  m_alarmTime;                     // 响铃时间
};
类与对象的关系就是类型与变量的关系。在程序中要使用一个对象,就用这个类声明一个变量,这个变量就是所需的对象。例如声明并使用一个闹钟对象:
AlarmClock clock;                      // 创建一个闹钟对象
 
clock.showCurTime();                   // 显示闹钟的当前时间
 
clock.alarm();                         // 响铃
提示
本节只给出了类的简单定义,有关类的详细说明,请参考下一章的内容。
对象的特征
对象有三个重要的特征:封装性、继承性和多态性。由于程序中的对象是对现实对象的模拟,所以在学习对象的时候,读者也可以将这两种对象对比起来理解。
 
封装性
对象从组成上来讲是数据和函数的集合。但是对于对象的使用者而言,并不能访问这个集合中的所有部分。使用者只能访问对象暴露出来的、可以被外部使用的部分,这些部分也可以看做对象的接口。而其他未暴露出来的部分则是对象的私有属性或者私有函数。私有属性和私有函数是为了实现对象的接口而存在的。
在前面的插图中,闹钟的时间、闹铃属性以及指示时间、到时响铃行为就是闹钟对象的对外接口,即外部使用者能够访问到的部分。而为了实现这些属性和行为,在对象的内部往往还有一些隐藏的部分,比如指针转动速度、预定响铃时间等私有属性,以及驱动指针转动、计算是否到预定时间等私有函数。
程序中的对象具有封装性,这一点同现实中的对象是一致的。人们在使用闹钟时,根本不需要知道其内部是怎么实现的,而设计闹钟的人也无意向用户暴露其中的细节。
继承性
继承是一种逻辑上的层次关系。在人类的思维中,有这样一种层次性的分类方法,即将一些事物按照一般到特殊的关系,先分成大类,再分成小类,各个小类也可以继续细分。大类与小类就构成了一种逻辑上的层次关系。大类(高层的类)称做基类(或者父类),小类(低层的类)称做派生类(或者子类)。基类与派生类的关系就是继承关系,派生类继承自基类。
多态性
多态性指的是同一行为在基类和派生类间,以及各个派生类间的表现并不相同。这里所说的同一行为,指的是在基类里定义并由各个派生类继承的函数。由于基类在定义这个函数时考虑的是一般的情况,并没有针对各种特殊情形,所以派生类往往需要重新定义这个函数。当系统运行时,虽然使用的是同一个函数名,但具体调用的函数却是被派生类重新定义的版本。由于不同的派生类有不同的定义,从而一个行为就会表现出不同的形式,也就是多态。
例如对于各种学校类,作为学校的基本功能,定义基类“学校类”时就应当定义招生、教育、考试等各种行为。但对于各种具体的学校类,如小学、中学、大学等,这些行为又是有差别的,必须根据各自的具体情况进行重新定义。当说一个学校招生时,不同的学校有不同的招生对象、方法等,所以招生这个行为就在不同种类的学校间表现出了多态性
原文地址:https://www.cnblogs.com/tangjunjun/p/11676489.html