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 を利用すると、コードがよりシンプルになり、複数の翻訳単位での定義に関する問題も回避できます。
-
JavaScriptでインスタンス間のプライベートメンバーを共有・操作する方法をわかりやすく解説
JavaScriptでは、コンストラクタ関数内でletやconstを使って変数を宣言すると、その変数は外部から直接アクセスできない「プライベートメンバー」となります。このプライベートな値には、関数内で定義された特権メソッド(クロージャ)を通じてのみアクセスできます。 以下は、Personコンストラクタでプライベートメンバーを持つ複数のインスタンスを作成し、それぞれの値を取得するサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang=ja> <head> <meta charset=UTF-8 /> <m
-
C++のnew演算子で確保したメモリを初期化する方法
C++のnew演算子は、メモリの「割り当て」を行うためのものであり、「初期化」まで自動的に行うものではありません。しかし、int型の配列をnewで動的に確保し、すべての要素をデフォルト値(intの場合は0)で初期化したい場合には、次のような構文を使用できます。基本構文:デフォルト初期化new int[10]();ポイントは、型名の後に空のかっこ () を付けることです。これにより、確保されたすべての要素がデフォルト初期化(ゼロクリア)されます。なお、この書き方では (0) のように具体的な値を指定したり、他の式を渡したりすることはできません。あくまで「デフォルト値での初期化」専用の構文である点