本期我们要讲的是 C++ 中的类。
我们终于讲到了面向对象编程,这是一种非常流行的编程方式,面向对象编程实际上只是一种你可以采用的编写代码的方式,其他语言例如 C#、Java 这些主要是面向对象的语言,事实上,用这些语言你真的不能写任何其他类型的代码,尽管你也可以尝试这样做,因为最终这些语言都是面向对象的语言,C++ 有点不同,因为它并没有强加给你一种特定的风格。
C 语言实际上并不支持面向对象编程,因为为了面向对象编程,你需要有一些概念,比如类和对象,这些东西 C 语言没有,如果你想使用面向对象的话 C++ 会添加所有这些功能。
在某种程度上使用面向对象总是一个好主意,我们将在本期讨论什么是类。
类是什么
简单地说,类只是对数据和功能组合在一起的一种方法。
例如,在一个游戏中,我们可能想要一些代表角色的东西,那么我们需要什么样的东西来代表一个角色呢?我们当然需要一些数据,例如,角色在游戏中的位置,角色可能拥有的某些属性,角色移动的速度,我们可能还需要一些 3D 模型,代表角色的屏幕形象。所有这些数据都需要存储在某个地方,实际操作中,我们可以为所有这些创建变量,让我们来看看它会是什么样子。
我们想要创建一个角色,然后想要一个角色位置以及它的速度,这些都是整数。你可能发现这有点乱了,因为这些名字太普通了,你可能想写成 PlayerX、 PlayerY,speed 改成 PlayerSpeed,哪怕是这样,还是有点乱。
尤其是当我们的游戏有 2 个角色时,你就不得不先复制,然后改成 PlayerX0、PlayerX1 等。
你当然可以使用数组,但其实问题重点还是一样的,它们只是一堆没有组合在一起的变量,他们是无组织的,只是被放在我们的代码中,这不是一个好方式。
另一个很好的例子可以说明为什么这很烦人,我想写一个函数来 move 角色,例如下面这样。
看起来更乱了,是吧。
所有这一切都变成了如此多的代码,难以维护,非常混乱,所以我们要做的就是通过使用类来简化它。
我们可以创建一个叫做 Player 类,它包含了所有的数据,我们想要把所有的变量变成一种类型。
在上面的代码中,我们创建一个名为 Player 的类,通过使用关键字 class,然后给它一个名字来实现。这个名字必须是唯一的,因为 class 是类型,这里是创建一个新的变量类型,然后是左右花括号,就像定义函数那样,注意末尾需要一个分号;在花括号里面,我们指定了我们需要的所有变量。
ok,我们创建了一个全新的类叫 Player,本质上它是一种类型,如果我们开始使用 Player 类,可以把它当作其他变量来创建。
我们给一个新变量命名为 player,类型是 Player。
由类类型构成的变量称为对象,新的对象变量称为实例,我们在这里所做的是实例化了一个 Player 对象,因为我们已经为那个 Player 类型创建了一个新实例。
如果我们想设置这些变量,如果你有一点概念基础的话可能会这样使用。
然而如果我们现在尝试编译,会得到一个错误。告诉我们 player 不能访问在类 Player 中声明的私有成员。
这是因为 “可见性” 的原因,当你创建一个新类时,您可以选择指定类中的内容的可见性,默认情况下,类中所有东西都是私有的,这意味着只有类中的函数才能访问这些变量。然而,我们希望能够从 main 函数中访问这些变量时,我们需要做的是把它设为 public(公有的)。
public 意味着我们可以在类之外的任何地方访问这些变量。我们会在以后的内容中更多地讨论可见性,现在先不讲这个。
现在编译,程序就没有问题了。
现在我们实现了第一个目标,已经彻底清理了代码,把所有的变量都放在了一个地方,这些变量集合可以代表一个 player,我们把它们恰当地分组了。
方法
现在我们有了这些数据,我们想让 Player 做一些事情,例如移动,所以要写一个函数来改变 X 和 Y 变量的值,我们怎么做呢?我们可以把它写成单独的函数。
这个函数的参数我们通过引用传递给它一个想要被移动的 Player,因为我们要修改 Player 对象。所以还要取 xa 和 ya,也就是我们在 X 轴和 Y 轴上 player 移动的距离。
我们现在试着调用这个函数。
没有问题。
我们可以做得更好一点,之前我说过,类实际上可以包含函数,这意味着我们可以将 Move 函数移动到类中,类内的函数被称为 方法 (method) 。
我们还做了一些修改,因为这个函数已经在类中了,所以不需要传入 player 对象了,因为它已经在 Player 对象中了,所以我删除了里面相关的内容,这样我们已经简化了我们的代码。
调用 Move 的过程如下。
好了,每个 Player 对象都有了自己的Move 函数,当我们为指定的 Player 对象调用 Move 时,这个 Player 对象将会移动,这与 Player 类之外的 Move 函数没有什么不同,它的作用就是让我们代码更干净,看起来更好看,当你处理很多代码时,这是一个巨大的优势,因为你有越多的代码,情况就越复杂,就越需要有这样的代码来保持代码整洁。
后话
这就是类的基本概念了,它允许我们将变量分组到一个类型中并为这些变量添加功能,因为如果你再回看一下这些代码,我们真正做的是在一个类型中定义了三个变量,我们还有一个处理这些变量的函数。当然这个函数可以做其他任何事情,但它的要点是,我们有数据和处理这些数据的函数,这就是所谓的类了。
类有很多用途,我们以后会讲到它们,今天讲的是类的基本概念,我们可以用类做更多的事情,接下来的几期会更详细地介绍这些内容。
另外,我希望你们记住,虽然类非常有用,可以让你的代码更简洁,但是如果不使用类搞不定的的事情,用类也一样搞不定,类不会给你提供任何新功能。同样你可以用类搞定的事情,不用类一样搞得定,这就是为什么像 C 这样的语言存在并且是完全可用的原因,他们没有所谓的类。然而我们仍然可以编写类,可以使我们编码更容易,因为类本质上只是语法糖,我们可以使用它来组织我们的代码,使它更容易维护。
为什么像 C 这样的语言存在并且是完全可用的原因,他们没有所谓的类。然而我们仍然可以编写类,可以使我们编码更容易,因为类本质上只是语法糖,我们可以使用它来组织我们的代码,使它更容易维护。
好了,本期就是这些内容了,下期再见。