← SEARCHABLE ARCHIVE
C / C++ · 2026-05-26

从 C++ 基础到掌握 — 第 6 集

何时使用结构和类?

INTERACTIVE READING MODE →

该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。

到目前为止,我们已经了解了变量和函数。 然而,在制作游戏时将怪物的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 很方便。 如果你想保护状态并约束行为,类更自然。