C++基础概念:类(Class)和对象(Object)

72 阅读3分钟

前言

类(class)和对象(object)都是C++中面向对象程序设计的核心概念。由于其相关概念经常被混淆,这里以文章的形式来梳理。

什么是“对象(Object)” ?

以现实世界为例,任何可以用“属性+行为”描述的事物都可以被称之为对象。比如“大象”就可以被视为一个“对象”,它的性别、身高和体重就是大象的“属性”,它可以用鼻子吸水和喷水、可以轻易地踩碎苹果的能力就是大象的“行为”。

类似的,在C++等面向对象程序设计中,“对象(object)”描述其属性的数据(data) 以及对这些数据施加的一组操作(method/functions) 封装在一起构成的统一体

比如在“植物大战僵尸”这款游戏中,可以把“豌豆射手”看作一个对象。那么“豌豆射手”这个对象的属性(data) 是什么?就是那些描述它的大小、颜色和种植时需要的阳光数量等性质的数据;“豌豆射手”这个对象的行为操作(method/functions) 是什么?左自主右摇摆和检测到僵尸时向僵尸发射豌豆等操作。

什么是“类(Class)” ?

同样以现实世界为例,大象与大象是不完全相同的,有些大象的鼻子更长一些,而有些大象的身躯更庞大些。虽然大象个体之间存在差异,但是我们看到它们时都称呼它们为“大象”,因为它们有相似的生物和行动特点,所有大象都有较大的体型,都可以用长鼻子灵活地拾起食物。由此,“大象” 是对各个大象个体的共有生物形象特征和行为特点的抽象

同样的,“类(class)” 是对有差异性又拥有极大相似性的 “对象”抽象。当然,“类” 也可以理解为是对于不同“对象”的共有属性和行为抽象

比如在“植物大战僵尸”这款游戏中,界面中一个又一个不断冒出来的僵尸就是一个个活生生的 “对象”。但同样是普通类型的僵尸,在实际游玩时会有不同的前进速度、啃食速度以及死亡后倒地的方向。试想:在实际编写游戏时,对于界面中每一个生成的僵尸,难道我们都要手动地书写不同的代码吗?当然不是,我们可以先制作“普通僵尸”的“模板”,规定基本的形象和啃食植物的行为,然后将这个模板稍加修改后就可以很方便地生成一个又一个优雅又不失个性的僵尸。这里我们首先编写的“普通僵尸”的“模板”便是一个 “类”

由此可见,对象是类的实例,类是对象的抽象。类是多个对象进行综合抽象的结果,对象又是类的个体实物,一个对象是类的一个实例。

数据成员(data)和成员函数(method)

为了更加规范和便于交流,我们通常说许多成员(members) 共同构成了类(class),这些成员(members) 要么是数据成员(data),要么是成员函数(member functions)。数据成员(data),即为上文中提到的“描述属性的数据”;成员函数(member functions),即为上文中提到的规定的“行为操作”。