【C++】クラスのメンバ変数 | データの種類とアクセス制御を徹底解説

目次

はじめに

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そのクラスの内部からのみアクセス可能。(デフォルト)
friendfriend宣言された外部の関数やクラスから、privateメンバへのアクセスを特別に許可する。

一般的に、メンバ変数は private にして隠蔽し、public なメンバ関数(ゲッター/セッター)経由でアクセスするのが、カプセル化の原則に則った良い設計です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次