C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++でプライベート静的メンバー変数を初期化する方法を解説

この記事では、C++におけるプライベート静的メンバー変数(private static member)の初期化方法について解説します。C++のクラスには、静的なメンバー関数やメンバー変数を持たせることができます。ただし、静的メンバー変数はクラス定義だけでは実体が確保されないため、クラス定義の外で明示的に初期化する必要があります

静的メンバー変数の初期化方法

静的メンバー変数を初期化する際は、次の構文を使用します。

データ型 クラス名::変数名 = 初期値;

ポイントは以下の通りです。

  • まずクラス名を記述する
  • 続けてスコープ解決演算子(::)を付ける
  • その後に変数名を書き、値を代入する

このようにして、クラスの外部からでも静的メンバー変数を定義・初期化できます。private指定されていても、クラススコープに属するメンバーとして正しくアクセスできます。

サンプルコード

以下のコードは、静的メンバー変数の初期化と、オブジェクトの生成数をカウントする例です。

#include <iostream>
using namespace std;

class MyClass {
    private:
        static int st_var; // 静的メンバー変数の宣言
    public:
        MyClass() {
            st_var++; // オブジェクト生成時にカウントを増やす
        }
        static int getStaticVar() {
            return st_var;
        }
};

int MyClass::st_var = 0; // クラス外での静的メンバー変数の初期化

int main() {
    MyClass ob1, ob2, ob3; // 3つのオブジェクトを生成
    cout << "Number of objects: " << MyClass::getStaticVar();
}

実行結果

Number of objects: 3

コードの解説

このプログラムでは、コンストラクタが呼ばれるたびに静的メンバー変数 st_var の値が1ずつ増加します。静的メンバー変数はすべてのオブジェクト間で共有されるため、3つのオブジェクト(ob1、ob2、ob3)を生成すると、値は「3」になります。

また、静的メンバー関数 getStaticVar() を使うことで、オブジェクトを介さずに MyClass::getStaticVar() の形式で直接呼び出すことができます。

補足:C++17以降のinline static

C++17以降では、inline static を使うことで、クラス定義内で直接静的メンバー変数を初期化できるようになりました。

class MyClass {
    private:
        inline static int st_var = 0; // クラス内で直接初期化可能
};

従来の方法ではヘッダーファイルとソースファイルを分けて管理する必要がありましたが、C++17の inline static を利用すると、コードがよりシンプルになり、複数の翻訳単位での定義に関する問題も回避できます。

  1. JavaScriptでインスタンス間のプライベートメンバーを共有・操作する方法をわかりやすく解説

    JavaScriptでは、コンストラクタ関数内でletやconstを使って変数を宣言すると、その変数は外部から直接アクセスできない「プライベートメンバー」となります。このプライベートな値には、関数内で定義された特権メソッド(クロージャ)を通じてのみアクセスできます。 以下は、Personコンストラクタでプライベートメンバーを持つ複数のインスタンスを作成し、それぞれの値を取得するサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <m

  2. C++のnew演算子で確保したメモリを初期化する方法

    C++のnew演算子は、メモリの「割り当て」を行うためのものであり、「初期化」まで自動的に行うものではありません。しかし、int型の配列をnewで動的に確保し、すべての要素をデフォルト値(intの場合は0)で初期化したい場合には、次のような構文を使用できます。基本構文:デフォルト初期化new int[10]();ポイントは、型名の後に空のかっこ () を付けることです。これにより、確保されたすべての要素がデフォルト初期化(ゼロクリア)されます。なお、この書き方では (0) のように具体的な値を指定したり、他の式を渡したりすることはできません。あくまで「デフォルト値での初期化」専用の構文である点