3-1-9. 静的メンバ

公開日: 16:53 3. オブジェクト指向編/3-1. クラスとオブジェクト/3-1-9.静的メンバ

staticキーワードを使ってstaticな(静的な)クラスメンバを定義することができます。staticとしてクラスのメンバを定義すると、いくつクラスオブジェクトが生成されようが、staticなメンバのコピーが1つだけであることを意味します。

staticなメンバはクラスのすべてのオブジェクトで共有されます。すべてのstaticなデータは最初にオブジェクトが生成された時に初期化を行わなかった場合、0で初期化されます。初期化をクラス定義内に入れることはできませんが、次の例のようにどのクラスのものか識別するスコープ解決演算子を使い、static変数を宣言し直すことでクラスの外から初期化することが可能です。

staticなデータメンバのコンセプトを理解するために次の例を試してみましょう。
#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 <<"コンストラクタの呼び出し" << endl;
         length = l;
         breadth = b;
         height = h;
         // オブジェクトが生成されたらカウント
         objectCount++;
      }
      double Volume()
      {
         return length * breadth * height;
      }
   private:
      double length;     // boxの縦幅
      double breadth;    // boxの横幅
      double height;     // boxの深さ
};

// Boxクラスのstaticなメンバを初期化
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 << "オブジェクトの合計: " << Box::objectCount << endl;

   return 0;
}
上のコードをコンパイルし実行すると、次の結果が得られます。
コンストラクタの呼び出し
コンストラクタの呼び出し
オブジェクトの合計: 2

staticなメンバ関数

staticとしてメンバ関数を宣言すると、特定のクラスオブジェクトから独立したものとなります。staticなメンバ関数はクラスのオブジェクトが存在しなくても呼び出され、staticな関数はクラス名とスコープ解決演算子(::)を使うだけでアクセスされます。

staticなメンバ関数はstaticなデータメンバ、他のstaticなメンバ関数、クラス外の関数にのみアクセスできます。 staticなメンバ関数はクラススコープを持ち、クラスのthisポインタへのアクセス権を持ちません。staticなメンバ関数をクラスオブジェクトが生成されたかされていないかを判断するのに利用することができます。

staticなメンバ関数のコンセプトを理解するために次の例を試してみましょう。
#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 <<"コンストラクタの呼び出し" << endl;
         length = l;
         breadth = b;
         height = h;
         // オブジェクトの生成をカウント
         objectCount++;
      }
      double Volume()
      {
         return length * breadth * height;
      }
      static int getCount()
      {
         return objectCount;
      }
   private:
      double length;     // boxの縦幅
      double breadth;    // boxの横幅
      double height;     // boxの深さ
};

// Boxクラスのstaticなメンバを初期化
int Box::objectCount = 0;

int main(void)
{
  
   // オブジェクト生成前のオブジェクトの合計を出力
   cout << "初期オブジェクト数: " << Box::getCount() << endl;

   Box Box1(3.3, 1.2, 1.5);    // box1の宣言
   Box Box2(8.5, 6.0, 2.0);    // box2の宣言

   // オブジェクト生成後のオブジェクトの合計を出力
   cout << "最終オブジェクト数: " << Box::getCount() << endl;

   return 0;
}
上のコードをコンパイルし実行すると、次の結果が得られます。
初期オブジェクト数: 0
コンストラクタの呼び出し
コンストラクタの呼び出し
最終オブジェクト数: 2
  • ?±??G???g???[?d????u?b?N?}?[?N???A

0 件のコメント :

コメントを投稿