【C++入門】静的クラスメンバーはいつ初期化される?仕組みとサンプルコードを解説
静的クラスメンバーとは
C++では、staticキーワードを使ってクラスに静的メンバー(スタティックメンバー)を定義できます。静的メンバーは特定のオブジェクトに属するのではなく、クラスそのものに紐づくメンバーです。
メモリ上には静的メンバーのコピーが1つだけ存在するため、オブジェクトをいくつ生成しても、すべてのオブジェクトが同じ値を共有します。オブジェクト間で共通のカウンタや設定値を管理したい場合などに非常に便利な仕組みです。
静的メンバーが初期化されるタイミング
静的クラスメンバーは、他の方法で明示的に初期化しない場合でも、自動的にゼロで初期化されます。静的記憶域期間を持つ変数は、プログラムの起動時(main()関数が実行される前)にゼロ初期化されるため、オブジェクトを生成する前にアクセスしても安全です。
一方、明示的に初期値を与えたい場合は、クラス定義の外側でスコープ解決演算子 :: を使って、次のような形式で定義・初期化します。
int Example::a = 20;
サンプルコード
以下は、C++における静的クラスメンバーの基本的な使い方を示すプログラム例です。
#include <iostream>
using namespace std;
class Example {
public:
static int a;
int func() {
cout << "The value of static member a: " << a;
}
};
int Example::a = 20;
int main() {
Example obj;
obj.func();
return 0;
}
実行結果
上記プログラムの出力は次のとおりです。
The value of static member a: 20
プログラムの解説
クラス定義と静的メンバーの初期化
クラスExampleでは、aが静的メンバーとして宣言されています。メンバー関数func()は、このaの値を出力します。クラス内での宣言だけではメモリが確保されないため、クラス定義の外側で「int Example::a = 20;」と記述して定義し、値20で初期化しています。
class Example {
public:
static int a;
int func() {
cout << "The value of static member a: " << a;
}
};
int Example::a = 20;
main()関数内の処理
main()関数では、クラスExampleのオブジェクトobjを生成し、func()を呼び出してaの値を表示しています。ここで重要なのは、静的メンバーaは個々のオブジェクトではなくクラスに属しているという点です。そのため、仮にオブジェクトを複数生成しても、参照される値は常に共通の1つだけです。
int main() {
Example obj;
obj.func();
return 0;
}
まとめ
- 静的メンバーはクラス全体で1つだけ存在し、すべてのオブジェクトで共有される
- 明示的に初期化しない場合、プログラム起動時にゼロで初期化される
- 初期化はクラス定義の外側で「型 クラス名::メンバー名 = 値;」の形式で行う
-
Javaのクラスメソッド(静的メソッド)とは?基本から使い方まで解説
Javaにおけるクラスメソッド(静的メソッド)とは、特定のオブジェクトのインスタンスではなく、クラスそのものに対して呼び出されるメソッドのことです。static修飾子を付けることで、すべてのクラスインスタンス間で同じ実装が保証されます。静的メソッドはインスタンス化せずに呼び出すことができるため、アクセスできるのはクラス内の他の静的メンバー(staticなフィールドやメソッド)のみです。インスタンス変数や非staticメソッドには直接アクセスできない点に注意しましょう。Javaの標準ライブラリにも多くの静的メソッドが用意されています。代表的な例としては、Math.random()、System.
-
Javaクラスの静的メンバーはどのような順序で読み込まれる?JVMの処理手順を解説
Javaにおいて、静的変数(static変数)はクラスがロードされるタイミングで生成されます。これは静的ブロック(staticブロック)が実行されるよりも前の段階であり、静的ブロックの主な役割は静的変数に値を代入することです。静的変数には、定義されたクラスのすべてのインスタンス間で共有される値が格納されます。一方、静的ブロックとは、クラスが最初にロードされるときに一度だけ実行されるコード領域のことです。したがって、クラスロード時に実行したい初期化処理やロジックがある場合は、その処理を静的ブロック内に記述しておくことで、クラスのロード時に確実に実行させることができます。JVMが静的メンバーを読み