今回は、C++での「クラス」について解説していきます。
「クラスって何?構造体と何が違うの?」
「メンバ変数とかメンバ関数とか、言葉がよくわからない…」
「コンストラクタって何のためにあるの?」
こんな疑問はありませんか?
クラスはC++を使うにあたって避けては通れない重要な概念ですが、最初は覚えることが多くて戸惑いがちです。
この記事では、ゲームの敵キャラクターを例にしながら、クラスの基本をひとつずつ丁寧に解説していきます。
この記事を読み終えると、あなたはC++のクラスの基本をマスターできると思いますので、ぜひ最後まで読んでいただけると嬉しいです。
クラスとは?
クラスとは、
- 「データ(変数)と処理(関数)をひとまとめにした設計図」
です。
たとえば、ゲームの敵キャラクターを考えてみましょう。
敵には「HP」「位置」などのデータがあり、「ダメージを受ける」「死んでいるか判定する」などの処理があります。
クラスは、そのデータと処理をひとつにまとめたものです。
そして、クラスという設計図から作った実体のことをインスタンス(オブジェクト)と呼びます。
「設計図=クラス」「設計図から作ったもの=インスタンス」と覚えておきましょう。
なぜクラスが必要なの?
クラスを使わない場合、敵キャラのデータはこんなふうにバラバラに管理することになります。
// ❌ クラスを使わない場合
int enemy1_hp = 100;
float enemy1_x = 0.0f;
float enemy1_y = 0.0f;
int enemy2_hp = 80;
float enemy2_x = 100.0f;
float enemy2_y = 50.0f;
// 敵が増えるたびに変数がどんどん増えていく…敵が10体、20体と増えるたびに変数が大量に増えて、どこで何を管理しているのかわからなくなります。
クラスを使えば、敵1体分のデータと処理をひとまとめにして、スッキリ管理できます。
基本の書き方
クラスの基本的な書き方は以下の通りです。
class クラス名 {
public:
// 外からアクセスできるメンバ
private:
// クラスの中からしかアクセスできないメンバ
}; // ← セミコロンを忘れずに!実際に敵キャラクターを表す Enemy クラスを書いてみましょう。
▼enemy.h
#pragma once
class Enemy {
public:
// コンストラクタ(インスタンス生成時に自動で呼ばれる)
Enemy(int hp, float x, float y);
// デストラクタ(インスタンスが消えるときに自動で呼ばれる)
~Enemy();
// ダメージを受ける
void TakeDamage(int damage);
// 死亡判定
bool IsDead() const;
// 位置を取得
float GetX() const;
float GetY() const;
private:
int m_hp; // HP
float m_x; // X座標
float m_y; // Y座標
};▼enemy.cpp
#include <iostream>
#include "enemy.h"
// コンストラクタ:: の後に初期化リストで初期値を設定
Enemy::Enemy(int hp, float x, float y)
: m_hp(hp), m_x(x), m_y(y)
{
std::cout << "Enemyが生成されました\n";
}
// デストラクタ
Enemy::~Enemy() {
std::cout << "Enemyが消えました\n";
}
// ダメージ処理
void Enemy::TakeDamage(int damage) {
m_hp -= damage;
if (m_hp < 0) m_hp = 0;
}
// 死亡判定
bool Enemy::IsDead() const {
return m_hp <= 0;
}
// 座標取得
float Enemy::GetX() const { return m_x; }
float Enemy::GetY() const { return m_y; }▼main.cpp
#include <iostream>
#include "enemy.h"
int main() {
// インスタンスを作る(HP:100, X:0.0, Y:0.0)
Enemy enemy(100, 0.0f, 0.0f);
std::cout << "ダメージを与える\n";
enemy.TakeDamage(30);
if (enemy.IsDead()) {
std::cout << "敵は倒れた\n";
} else {
std::cout << "敵はまだ生きている\n";
}
return 0;
}実行結果
Enemyが生成されました
ダメージを与える
敵はまだ生きている
Enemyが消えました
クラスの宣言をヘッダファイルに書いて分割する方法については、プロトタイプ宣言の記事もあわせて読んでみてください。
アクセス修飾子(public / private)
クラスの中には public と private というアクセス修飾子があります。
- public:クラスの外からでもアクセスできる
- private:クラスの中からしかアクセスできない(class のデフォルト)
m_hp などの内部データを private にしておくことで、外から勝手に値を書き換えられるのを防げます。
データは private に置き、外からは public の関数(TakeDamage など)を通してだけ操作させる、というのがクラス設計の基本的な考え方です。
コンストラクタとデストラクタ
コンストラクタとは、
- 「インスタンスが生成されるときに自動で呼ばれる関数」
です。クラス名と同じ名前で書きます。主にメンバ変数の初期化に使います。
デストラクタとは、
- 「インスタンスが消えるときに自動で呼ばれる関数」
です。~クラス名 の形で書きます。動的確保したメモリの解放などに使います。
変数の初期化方法が気になる方は、変数の初期化 =0 と {0} の違いの記事もあわせて読んでみてください。
structとclassの違い
C++には似たような書き方で struct(構造体)もあります。
実は機能面での違いはほぼ1つだけで、
struct:メンバのデフォルトが publicclass:メンバのデフォルトが private
この違いだけです。
struct Point {
float x; // デフォルトでpublic
float y;
};
class Enemy {
int m_hp; // デフォルトでprivate
};一般的な使い分けとして、データをまとめるだけの単純な型には struct、関数や非公開データを持つ本格的な設計には class を使うケースが多いです。
【重要】私が実際にゲーム制作でハマった体験談
自主制作の2Dシューティングゲームを作っていたとき、最初は敵キャラのデータをすべてグローバル変数で管理していました。
// ❌ 最初に書いていた管理方法
int enemy_hp[10];
float enemy_x[10];
float enemy_y[10];
bool enemy_alive[10];敵が1〜2体のうちはなんとかなっていましたが、種類が増えてきた途端に「どの配列がどの敵のものか」がわからなくなり、バグを直すたびに別のバグを生む状態になっていました。
そこで Enemy クラスにまとめ直したところ、敵1体分のデータと処理がひとかたまりになって、コードが一気に読みやすくなりました。
バグの発生源も追いやすくなって、修正時間が格段に短くなった実感があります。
「変数が増えてきてカオスになってきた」と感じたタイミングが、クラスを使い始めるサインだと思います。
よくある失敗例と対処法
- private なメンバに外からアクセスしてコンパイルエラー
→classのメンバはデフォルトでprivateです。外から使いたいメンバはpublicに書くか、public なゲッター関数を用意して間接的にアクセスしましょう。
- コンストラクタを書かずにメンバ変数がゴミ値になっている
→ コンストラクタで初期化しないと、メンバ変数に何が入っているか保証されません。コンストラクタで必ずすべてのメンバ変数を初期化する習慣をつけましょう。
- クラス定義の末尾のセミコロン(;)を忘れる
→ C++のクラス定義は末尾に;が必要です。忘れると意味不明なエラーが大量に出るので注意してください。
クラスと合わせて static メンバを使う場面も増えてきます。staticの使い方の記事もあわせて読んでおくと理解が深まります。
まとめ
- ✅ クラスは「データ(変数)と処理(関数)をひとまとめにした設計図」
- ✅ クラスから作った実体をインスタンス(オブジェクト)という
- ✅ public:外からアクセスできる / private:クラス内からしかアクセスできない
- ✅ コンストラクタ:インスタンス生成時に自動で呼ばれる(初期化に使う)
- ✅ デストラクタ:インスタンスが消えるときに自動で呼ばれる
- ✅
structとclassの違いはデフォルトのアクセス修飾子だけ(struct は public、class は private) - ✅ クラス定義の末尾にはセミコロン(;)を忘れずに
これでC++のクラスの基本はバッチリですね!
ここまで読んでくださり、ありがとうございました。
この記事が皆様の学習の役に立てば幸いです。

