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

C++の静的メンバー変数とは?初期化方法をサンプルコード付きで解説

C++の静的メンバー変数(staticメンバー変数)は、staticキーワードを使って定義される特殊なクラスメンバーです。最大の特徴は、メモリ上にただ1つのコピーしか存在しないという点にあります。そのため、クラスからいくつオブジェクトを生成しても、静的メンバー変数はすべてのオブジェクト間で共有されます。

また、静的メンバー変数が何らかの方法で明示的に初期化されていない場合、クラスの最初のオブジェクトが生成された時点で自動的に0に初期化されるというルールもあります。

静的メンバー変数の主な特徴

  • クラス全体で共有される単一のコピーを持つ
  • オブジェクトごとではなく、クラスに属する変数として扱われる
  • クラス内では宣言のみを行い、クラス外部で「クラス名::変数名」の形式により定義・初期化が必要
  • 未初期化の場合、最初のオブジェクト生成時に0で初期化される

サンプルプログラム

以下は、C++における静的メンバー変数の宣言と初期化の動作を示すサンプルプログラムです。

#include <iostream>
using namespace std;
class Demo {
    public :
    static int num;
    int display() {
        cout << "The value of the static member variable num is: " << num;
    }
};
int Demo::num = 100;
int main() {
    Demo obj;
    obj.display();
    return 0;
}

実行結果

このプログラムを実行すると、次のような出力が得られます。

The value of the static member variable num is: 100

プログラムの解説

クラス定義と静的メンバー変数の初期化

クラスDemoの中では、numが静的メンバー変数として宣言されています。メンバー関数display()は、このnumの値を出力します。注目すべきは、クラス定義の外にある次の行です。

int Demo::num = 100;

静的メンバー変数はクラス内では宣言だけを行い、実際のメモリ確保と初期化はクラスの外部でスコープ解決演算子::を使って行う必要があります。ここではnumを100という値で初期化しています。

main関数での処理

main()関数では、クラスDemoのオブジェクトobjを生成し、display()関数を呼び出してnumの値を表示しています。

int main() {
    Demo obj;
    obj.display();
    return 0;
}

このように、静的メンバー変数はオブジェクトを介さずとも「Demo::num」のようにアクセスできる点も重要なポイントです。設定した値100が出力されていることから、クラス外部での初期化が正しく機能していることが確認できます。

  1. フリップフロップの種類と相互変換の方法を徹底解説

    フリップフロップ(flip-flop)は、順序論理回路の基本要素となるデジタル回路です。フリップフロップにはいくつかの種類があり、本記事では代表的な4種類の特徴と動作、さらに「あるフリップフロップから別のフリップフロップへ変換する」ための具体的な手順を解説します。フリップフロップには主に以下の4種類があります。SRフリップフロップDフリップフロップJKフリップフロップTフリップフロップSRフリップフロップとはSRフリップフロップは、クロック信号の立ち上がりエッジまたは立ち下がりエッジでのみ動作します。一方、SRラッチはイネーブル信号によって動作する点が異なります。SRフリップフロップの回路図を

  2. Javaのクラス変数(静的変数)とは?仕組みと使い方をサンプルコードで解説

    Javaにおけるクラス変数は「静的変数(static変数)」とも呼ばれ、メソッドの外側で static キーワードを使って宣言される変数です。 静的変数の最大の特徴は、そのクラスのすべてのインスタンス(オブジェクト)で値が共有されるという点です。変数のコピーはメモリ上に1つだけ存在し、すべてのオブジェクトが同じ値を参照します。 静的変数の主な特徴 static キーワードを付けて宣言する メソッドの外側(クラス直下)に定義する 全インスタンスで1つのコピーを共有する オブジェクトを生成しなくても「クラス名.変数名」でアクセスできる サンプルコード public class Demo{