目次
はじめに
C++のクラスは、オブジェクトの状態を表すデータを保持します。このクラス内で宣言された変数のことを「メンバ変数」または「データメンバ」と呼びます。メンバ変数には、オブジェクトごとに存在する通常の変数、クラス全体で共有される静的変数など、いくつかの種類があります。
この記事では、C++クラスのデータ管理の基礎となる、各種メンバ変数の使い方と、それらへのアクセスを制御する仕組みについて解説します。
1. 非静的メンバ変数
最も一般的なメンバ変数です。クラスから生成されるオブジェクトごとに、それぞれ独立したメモリ領域を持ちます。
サンプルコード
C++
#include <iostream>
#include <string>
class Player {
public:
// C++11以降、非静的メンバ変数は宣言時に直接初期化できる
std::string name = "名無し";
int level = 1;
};
int main() {
Player player1, player2;
player1.name = "勇者";
// player1とplayer2のnameは、それぞれ別の値を持つ
std::cout << player1.name << std::endl; // -> 勇者
std::cout << player2.name << std::endl; // -> 名無し
return 0;
}
2. 静的メンバ変数 (static
)
static
キーワードを付けて宣言されたメンバ変数は、特定のオブジェクトに属さず、そのクラス全体で共有されます。どのオブジェクトからアクセスしても、常に同じ一つの変数を参照します。
サンプルコード
class Player {
public:
// 静的メンバ変数の宣言
static int player_count;
Player() {
player_count++; // オブジェクトが作られるたびにカウンタを増やす
}
};
// 静的メンバ変数の定義と初期化 (必ずクラスの外に記述)
int Player::player_count = 0;
int main() {
std::cout << "初期プレイヤー数: " << Player::player_count << std::endl;
Player p1;
Player p2;
std::cout << "最終プレイヤー数: " << Player::player_count << std::endl; // -> 2
return 0;
}
3. mutable
指定子
const
修飾子が付いたメンバ関数(オブジェクトの状態を変更しないと約束した関数)の中で、例外的に変更を許可したいメンバ変数に mutable
を付けます。キャッシュの更新など、限定的な用途で使われます。
4. アクセス制御
メンバ変数へのアクセスは、public
, protected
, private
のアクセス指定子で厳密に制御されます。
指定子 | 説明 |
public | どこからでもアクセス可能。 |
protected | そのクラスと、そのクラスを継承した子クラスからのみアクセス可能。 |
private | そのクラスの内部からのみアクセス可能。(デフォルト) |
friend | friend 宣言された外部の関数やクラスから、private メンバへのアクセスを特別に許可する。 |
一般的に、メンバ変数は private
にして隠蔽し、public
なメンバ関数(ゲッター/セッター)経由でアクセスするのが、カプセル化の原則に則った良い設計です。