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

C++における静的データメンバーの初期化方法をわかりやすく解説

静的データメンバーとは

C++では、クラス内に静的(static)なメンバーを定義できます。静的メンバーには関数と変数の両方が含まれます。特に静的メンバー変数は、そのクラスから生成されたすべてのオブジェクト間で共有される単一のコピーを持つという重要な特徴があります。

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

静的メンバー変数は、クラス定義の内部では宣言のみを行います。実際にメモリを確保して値を代入する(定義と初期化)処理は、クラス定義の外部で行う必要があります。

初期化を行う際は、「クラス名」に続けてスコープ解決演算子「::」を記述し、その後に変数名を指定します。この形式を使うことで、どのクラスに属する静的変数なのかを明確に示し、任意の値を代入できます。

書式は以下の通りです。

int クラス名::変数名 = 初期値;

サンプルコード

次のコードは、静的メンバー変数の初期化手法を示したものです。この例では、生成されたオブジェクトの個数をカウントしています。

#include <iostream>
using namespace std;
class MyClass {
    private:
        static int st_var;
    public:
        MyClass() {
            st_var++; // 新しいオブジェクトが生成されるたびに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

コードの解説

このプログラムでは、クラスMyClass内で静的メンバー変数st_varを宣言し、クラス定義の外側でint MyClass::st_var = 0;と記述して0で初期化しています。

コンストラクタは新しいオブジェクトが生成されるたびに呼び出されるため、st_varの値が1ずつ増加します。main関数内で3つのオブジェクト(ob1、ob2、ob3)を生成しているため、最終的にgetStaticVar()が返す値は3となります。

このように静的メンバー変数は全オブジェクトで共有されるため、オブジェクトの個数管理など、クラス全体に関わる状態を保持するのに非常に便利です。

  1. C++で学ぶ循環キュー(リングバッファ)データ構造の実装方法

    キュー(Queue)は、要素の集合を格納する抽象データ構造の一つです。キューはFIFO(First In, First Out:先入れ先出し)という仕組みを採用しており、最初に挿入された要素が最初に取り出されます。キューは線形データ構造として表現できますが、単純な配列で実装すると問題が発生する場合があります。挿入操作と削除操作を繰り返すうちに、先頭(front)と末尾(rear)の位置が配列の後方へ移動していきます。その結果、実際には空きスペースが残っているにもかかわらず、論理的な制約によって新しい要素を挿入できなくなることがあります。この問題を解決するために使われるのが循環キュー(Circu

  2. C++で二分木を簡潔にエンコード・デコードする方法

    二分木の簡潔なエンコーディングとはここに一つの二分木があるとします。ご存知の通り、二分木の簡潔なエンコーディング(succinct encoding)とは、理論上の最低限に近い記憶領域で木の構造を表現できる手法です。構造的に異なる「n個のノードを持つ二分木」の総数は、n番目のカタラン数(Catalan number)によって表されます。nが大きくなると、この数はおよそ4^nに近づくため、エンコードには最低でも log₂(4^n) = 2n ビットが必要になります。したがって、簡潔な二分木は 2n + O(n) ビット程度で表現できることになります。たとえば、次のような二分木が入力として与えられ