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 很方便。 如果你想保護狀態並約束行為,類別更自然。