从 C++ 基础到掌握 — 第 6 集
何时使用结构和类?
该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。
到目前为止,我们已经了解了变量和函数。 然而,在制作游戏时将怪物的ID、名称和体力作为变量单独管理是相当麻烦的。
int monsterId = 1;
std::string monsterName = "Slime";
int monsterHealth = 30;
如果怪物有100个,变量就会不断增加。 在这种情况下,结构用于将相关数据分组在一起。
结构体
#include <string>
struct Item
{
int id;
std::string name;
int price;
};
Item sword{1, "Sword", 100};
Item sword{1, "Sword", 100};使用花括号将成员按顺序排列的方法称为聚合初始化。 结构不是特殊的内存块。它是一种用户定义的类型,将相关值与名称分组。
void PrintItem(const Item& item)
{
std::cout << item.name << '\n';
}
Item MakePotion()
{
return Item{2, "Potion", 50};
}
结构也可以作为参数传递给函数或作为值返回。std::vector<Item>也可以存放在同一个容器中。
班级
如果只是将数据放入结构体中,体力就可以从外部改变为奇怪的值。
monster.health = -9999;
晚安。它可以编译,但是怪物的状态被破坏了。 为了防止这种情况发生,请将数据和更改数据的操作绑定到同一个类。
#include <algorithm>
#include <string>
class Monster
{
public:
Monster(int id, const std::string& name, int health)
: id(id), name(name), health(health)
{
}
void TakeDamage(int damage)
{
health = std::max(0, health - damage);
}
int GetHealth() const
{
return health;
}
const std::string& GetName() const
{
return name;
}
private:
int id;
std::string name;
int health;
};
public是要对外公开的部分,private是仅在类内部使用的部分。 将成员变量隐藏为私有并通过公共函数更改其状态称为封装。
在构造函数之后: id(id), name(name), health(health)是构造函数初始化列表。 成员不是在创建对象后才赋值,而是在创建时就被初始化。
结构和类看起来是完全不同的东西,但在C++中,最大的区别是默认的访问说明符不同。 结构默认是公共的,类默认是私有的。
对于简单的值分组来说,struct 很方便。 如果你想保护状态并约束行为,类更自然。