クラス設計では、メンバ変数への直接アクセスを避けること(カプセル化)
が基本的な考え方です。
変数を public
にして外部から自由に操作できるようにすると、予期しない値の変更や不正な状態を引き起こす可能性があります。
そのため、変数を private
にし、必要に応じてゲッター(getter) や
セッター(setter)
を通して安全にアクセスさせる、という定番の設計手法があります。
この資料では、クラスの値を安全に扱うための3つの考え方、 ゲッター(getter)、セッター(setter)、そしてプロパティ(property) について学びます。
これらを使うことで、クラスの内部データを保護し、不正な値の代入を防ぐことができます。
// 09_2_getter_setter.cpp
#include <iostream>
using namespace std;
class Player {
private:
int hp;
public:
Player(int initHp) : hp(initHp) {}
// ゲッター
int getHp() const {
return hp;
}
// セッター
void setHp(int value) {
if (value >= 0) hp = value; // 不正値を防ぐ
}
};
int main() {
Player p(100);
cout << "初期HP: " << p.getHp() << endl;
p.setHp(80);
cout << "攻撃を受けた後のHP: " << p.getHp() << endl;
p.setHp(-50); // 無効な値
cout << "不正な値を設定後のHP: " << p.getHp() << endl;
return 0;
}実行結果(例)
初期HP: 100
攻撃を受けた後のHP: 80
不正な値を設定後のHP: 80
👉 hp
を直接外部から変更できないようにすることで、データの安全性を保つ。
| 目的 | 説明 |
|---|---|
| 安全性 | 不正な値(例:負のHP)の代入を防ぐことができる |
| 拡張性 | 将来、値を変更する処理を追加しても、呼び出し側を変えずに済む |
| 可読性 | getHp() や setHp()
の名前で、意図が明確になる |
(以下、C++には無い機能ですが記載しておきます)
近年の言語(C#など)では、ゲッター・セッターをより自然に使えるようにした プロパティという仕組みがよく使われています。
C++では正式な機能としては存在しませんが、同じ考え方を理解しておくと、 他の言語や将来のC++仕様を学ぶときに役立ちます。認識しておく必要はあるでしょう。
// C#のプロパティ例
public class Player {
private int hp;
public int Hp {
get { return hp; } // 読み出し時に呼ばれる
set {
if (value >= 0) hp = value; // 不正値を防ぐ
}
}
}
void Main() {
Player p = new Player();
p.Hp = 100; // setterを通じて値を設定
Console.WriteLine(p.Hp); // getterを通じて値を取得
p.Hp = -50; // 不正な値は無視される
Console.WriteLine(p.Hp); // 100 のまま
}👉 Hp に直接アクセスしているように見えますが、内部では
get / set が自動的に呼ばれています。
C++にはプロパティ構文はありませんが、次のように明示的に関数を書くことで同様の仕組みを表現できます。
// 09_2_property_like.cpp
#include <iostream>
using namespace std;
class Player {
private:
int hp;
public:
int getHp() const { return hp; }
void setHp(int value) { hp = value; }
}; constの意味は下記の通り。
変数へのconst指定:この変数の値は変更できない
関数へのconst指定:この関数はオブジェクトの状態を変更しない
👉 C++では、getter/setterを自分で定義するのが基本です。
将来的にC++にもプロパティ構文が追加される可能性はありますが、 現時点では「ゲッター/セッター=安全なアクセス方法」として理解しておくことが重要です。