C++の基礎 : 静的メンバ
静的メンバ
クラスのメンバに static キーワードをつけることで、静的メンバを宣言することができます。
静的メンバとは、クラスのオブジェクトに属するメンバではなく、クラスそのものに属するメンバです。
静的メンバ変数
静的メンバ変数を宣言するには、メンバ変数に static キーワードをつけます。静的メンバ変数を定義するには、「クラス名+"::"+静的メンバ変数名」という名前のグローバル変数を定義します。クラスの外部から静的メンバ変数を参照するには、「クラス名+"::"+静的メンバ変数名」という名前で参照します。
静的メンバ変数はオブジェクトに属するメンバ変数ではなく、クラスに属するメンバ変数です。アクセス制限が設定されていることを除けば、グローバル変数と同じものであると考えて差し支えありません。
次の例では、作成された Bomb オブジェクトの数を、静的メンバ変数を使用して数えています。
class Bomb { public: static SIntN count; // 爆弾の数 Bomb() { ++count; } ~Bomb() { --count; } }; SIntN Bomb::count = 0; // 0 個に初期化 Void MyFunction() { SIntN bombCount; bombCount = Bomb::count; }
Bomb のコンストラクタで静的メンバ変数を増加し、デストラクタで減少しています。静的メンバは特定のオブジェクトに属するメンバではなく、Bomb クラスに属するメンバ変数であるため、これによって作成されている Bomb オブジェクトの数を数えることができます。
BREW では静的メンバ変数を使用することはできませんので注意してください。
静的メンバ関数
静的メンバ関数を宣言するには、メンバ関数に static キーワードをつけます。クラスの外部から静的メンバ関数を呼び出すには、「クラス名+"::"+静的メンバ関数名」という形式で呼び出します。
静的メンバ関数はオブジェクトに属するメソッドではなく、クラスに属するメソッドです。静的メンバ関数は、アクセス制限が設定されていることを除けば、グローバル関数と同じものであると考えて差し支えありません。
次の例では、Color クラスに GetGray 静的メンバ関数を定義しています。この関数は灰色を表す Color オブジェクトを作成して返します。このような働きをする関数は特定の Color オブジェクトに作用するものではないため、静的メンバ関数として実装しているのです。
class Color { public: UInt08 r, g, b; Color() {} Color(UInt08 r0, UInt08 g0, UInt08 b0) { r = r0; g = g0; b = b0; } static Color GetGray() { return Color(128, 128, 128); } }; Void MyFunction() { Color gray = Color::GetGray(); // 静的メンバ関数の呼び出し }
【Java では】Java でも static キーワードを使うことで、静的フィールドや静的メソッドを定義できます。
この章のまとめ
- 静的メンバ変数を宣言するには、メンバ変数に static キーワードをつけます。
- 静的メンバ変数を定義するには、「クラス名+"::"+静的メンバ変数名」 という名前のグローバル変数を定義します。
- 静的メンバ変数は、アクセス制限が設定されていることを除けば、 グローバル変数と同じものであると考えて差し支えありません。
- BREW では静的メンバ変数を使用することはできません。
- 静的メンバ関数を宣言するには、 メンバ関数に static キーワードをつけます。
- クラスの外部から静的メンバ関数を呼び出すには、 「クラス名+"::"+静的メンバ関数名」という形式で呼び出します。
- 静的メンバ関数は、アクセス制限が設定されていることを除けば、 グローバル関数と同じものであると考えて差し支えありません。
やってみよう
次のようなコードを実行してみましょう!
静的メンバ関数はユーティリティ関数としても使えます。他の静的メンバ関数も定義して使ってみましょう。
class MyChar { public: static Bool IsDigit(AChar c) { return ('0' <= c && c <= '9'); } static Bool IsAlpha(AChar c) { return ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z'); } static Bool IsWhiteSpace(AChar c) { return (c == ' ' || c == '\t'); } }; Void TestStatic(Void) { AChar c = '5'; if (MyChar::IsDigit(c)) SFXHelper::dbgprintf("'%c' is digit", c); if (MyChar::IsAlpha(c)) SFXHelper::dbgprintf("'%c' is alphabet", c); }