C++ クラスの静的メンバー
私たちは使用できますstaticキーワードを使用してクラスのメンバーを静的として定義します。クラスのメンバーを静的として宣言すると、これはクラスのオブジェクトをいくつ作成しても、静的メンバーはただ1つのコピーしか持たないことを意味します。

静的メンバーはクラスのすべてのオブジェクト間で共有されます。他に初期化文が存在しない場合、最初のオブジェクトが作成されるときに、すべての静的データはゼロに初期化されます。静的メンバーの初期化をクラスの定義内に置くことはできませんが、クラスの外部でスコープ解決演算子を使用して::静的変数を再宣言して初期化することができます。次の例のようになります。
以下の例は、静的メンバーデータの概念をよりよく理解するのに役立ちます:
例
#include <iostream>
using namespace std;
class Box
{
public:
static int objectCount;
// コンストラクタの定義
Box(double l=2.0, double b=2.0, double h=2.0)
{
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h;
// オブジェクトが作成されるたびに1増加
objectCount++;
}
double Volume()
{
return length * breadth * height;
}
private:
double length; // 長さ
double breadth; // 幅
double height; // 高さ
};
// クラス Box の静的メンバーを初期化
int Box::objectCount = 0;
int main(void)
{
Box Box1(3.3, 1.2, 1.5); // box1 を宣言
Box Box2(8.5, 6.0, 2.0); // box2 を宣言
// オブジェクトの総数を出力
cout << "Total objects: " << Box::objectCount << endl;
return 0;
}
上記のコードがコンパイルされて実行されると、次の結果が生成されます:
Constructor called. Constructor called. Total objects: 2
静的メンバー関数
関数メンバーを静的として宣言すると、関数をクラスの特定のオブジェクトから独立させることができます。静的メンバー関数は、クラスオブジェクトが存在しない場合でも呼び出すことができます。静的関数クラス名とスコープ解決演算子を使用するだけで::アクセスできます。
静的メンバー関数は、静的メンバーデータ、他の静的メンバー関数、およびクラスの外部の他の関数にのみアクセスできます。
静的メンバー関数にはクラススコープがあり、クラスの this ポインタにはアクセスできません。静的メンバー関数を使用して、クラスの特定のオブジェクトが作成されたかどうかを判断できます。
静的メンバー関数と通常のメンバー関数の違い:
- 静的メンバー関数には this ポインタがなく、静的メンバー(静的メンバー変数と静的メンバー関数を含む)にのみアクセスできます。
- 通常のメンバー関数には this ポインタがあり、クラス内の任意のメンバーにアクセスできます。一方、静的メンバー関数には this ポインタがありません。
以下の例は、静的メンバー関数の概念をよりよく理解するのに役立ちます:
例
#include <iostream>
using namespace std;
class Box
{
public:
static int objectCount;
// コンストラクタの定義
Box(double l=2.0, double b=2.0, double h=2.0)
{
cout <<"Constructor called." << endl;
length = l;
breadth = b;
height = h;
// オブジェクトが作成されるたびに1増加
objectCount++;
}
double Volume()
{
return length * breadth * height;
}
static int getCount()
{
return objectCount;
}
private:
double length; // 長さ
double breadth; // 幅
double height; // 高さ
};
// クラス Box の静的メンバーを初期化
int Box::objectCount = 0;
int main(void)
{
// オブジェクトを作成する前にオブジェクトの総数を出力
cout << "Inital Stage Count: " << Box::getCount() << endl;
Box Box1(3.3, 1.2, 1.5); // box1 を宣言
Box Box2(8.5, 6.0, 2.0); // box2 を宣言
// オブジェクトを作成した後にオブジェクトの総数を出力
cout << "Final Stage Count: " << Box::getCount() << endl;
return 0;
}
上記のコードがコンパイルされて実行されると、次の結果が生成されます:
Inital Stage Count: 0 Constructor called. Constructor called. Final Stage Count: 2その他の拡張
C++ クラス & オブジェクト