面向对象编程,这里面向本意是基于对象进行编程,以对象为基础来组织代码来进行编程。是一种流行的编程风格,曾经风靡一时。典型的代表就是大名鼎鼎的 java 和 c#。c 并不是面向对象编程的语言,其中也没有类和对象的概念。而在 c++ 中支持面向对象编程,c++ 中的类是用于组织数据和方法。
1. class 和 struct
例如在游戏中的人物,怎么表示人物,我们可通过位置和速度来表示人物的移动。3d表示人物的外表。
看起来,这样变量定义不是很清晰,调整一下,我们用 PlayerX PlayerY PlayerSpeed 代替 x y speed 来定义player 想象一下,一般在游戏中会有多个玩家,我们就需要定义一些列 PlayerNX 来表示不同玩家,这样代码看上去有些问题。这样下去,随着开发 player 变得越来越复杂。这种形式就难以应付复杂情况了。
我们可以用 class 来简化上面的代码,以 class 形式定义 player。我们定义一个 Player 类,如下图。然后实例化一个 Player 的实例 player。类(class)定义中默认情况下的成员是 private 的,所以当我们 palyer.x = 10 时,编译时会报错,提示 x 是 player 的私有属性。私有表示只有 class 内部的方法可以使用该属性,外部是无法使用私有属性的。我们将 x, y 定义为公有属性。
定义一个函数 Move 接受 Player 引用和两个 int 类型的数据作为参数,来更新 Player 对象的 x y 位置.
我们可以将这个与 Player 类关系密切的函数移入 Player 类,这样就简化了代码,看起来也更人性化。大家注意我们用 struct 代替 class 来定义 Player,在这里顺便介绍一下 struct。
在c++中类与结构体的唯一区别是:类(class)定义中默认情况下的成员是private的,而结构体(struct)定义中默认情况下的成员是 public 的。
在 c 中不支持 class 这个关键字,我们于可以将 class 定义为 struct 来解决这个问题。
2.静态数据成员
静态属性,类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。静态数据成员实际上是类域中的全局变量。
通过一个实例来更深入地了解 class 和 struct 静态属性。我们定义 Entity struct,两个x, y 属性一个 Print 打印方法。
然后实例化两个 Entity 的实例,并使用 Print 输出值。
将 Entity struct 的 x, y 修改为静态成员属性。
我们调整代码后再次输出,发现链接时报错了,无法解析的外部符号...,
我们需要初始化一下静态成员属性,无需赋值。
我们再次运行代码,发现这次虽然没报错,但是两次的打印结果相同,这是因为静态数据成员被类的所有对象所共享。所以静态数据成员作用域为类级别而非对象级别
如果我们这样写来为 x, y 赋值就更加清晰了。
3继承
定义了两个 class 第一个 class Entity 我们定义 x 和 y 坐标和一个更新坐标的 Move 方法,第二类 class Player 在 Entity 基础上多了一个 name 成员属性。
我们可以让 Player 继承 Entity类,便可以获得 Entity 所有属性和方法,这样就达到去掉相同代码效果,避免代码重复。
输出 Entity 所在内存字节数为 8 = float(4) + float(4)
输出 Player 所在内存数为 12(32位 char 为 4,而 64 位 char 为 8)=float + float + char
领取专属 10元无门槛券
私享最新 技术干货