C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++における静的メンバーの定義方法と使い方を解説

C++のクラスにおける静的メンバーは、staticキーワードを使用して定義できます。静的メンバーは、クラスのオブジェクトがいくつ生成されていても、メモリ上にはただ一つのコピーしか存在しません。そのため、静的メンバーはそのクラスのすべてのオブジェクトによって共有されることになります。

静的メンバーは、明示的に初期化しない場合、クラスの最初のオブジェクトが生成された時点で自動的にゼロに初期化されます。

以下に、静的メンバーの定義方法を示すサンプルプログラムを紹介します。

サンプルコード

#include <iostream>
using namespace std;

class Point{
    int x;
    int y;

    public:
    static int count;

    Point(int x1, int y1){
        x = x1;
        y = y1;

        count++;
    }

    void display(){
        cout<<"The point is ("<<x<<","<<y<<")\n";
    }
};

int Point::count = 0;

int main(void){
    Point p1(10,5);
    Point p2(7,9);
    Point p3(1,2);

    p1.display();
    p2.display();
    p3.display();

    cout<<"\nThe number of objects are: "<<Point::count;

    return 0;
}

上記プログラムの出力結果は以下の通りです。

The point is (10,5)
The point is (7,9)
The point is (1,2)

The number of objects are: 3

プログラムの解説

クラスPointには、座標を表す2つのデータメンバーxとyが定義されています。さらに、Pointクラスのオブジェクトがいくつ生成されたかを記録するための静的メンバーcountが用意されています。コンストラクタPoint()はxとyの値を初期化すると同時にcountをインクリメントし、display()関数は座標の値を画面に表示します。該当するコードは以下の通りです。

class Point{
    int x;
    int y;

    public:
    static int count;

    Point(int x1, int y1){
        x = x1;
        y = y1;

        count++;
    }

    void display(){
        cout<<"The point is ("<<x<<","<<y<<")\n";
    }
};

main()関数では、Pointクラスのオブジェクトを3つ生成しています。その後、display()関数を呼び出して各オブジェクトの値を表示し、最後にcountの値を出力しています。該当するコードは以下の通りです。

Point p1(10,5);
Point p2(7,9);
Point p3(1,2);

p1.display();
p2.display();
p3.display();

cout<<"\nThe number of objects are: "<<Point::count;

ここで重要なのは、静的メンバーcountはクラス宣言の外部で「int Point::count = 0;」のように定義・初期化する必要があるという点です。クラス宣言内では宣言のみを行い、実際のメモリ確保はクラスの外側の定義で行われます。この仕組みによって、すべてのオブジェクトで共有される単一の領域が実現しています。

ポイントまとめ

  • 静的メンバーはstaticキーワードを使って宣言する
  • クラスの外部で定義・初期化が必要(例:int Point::count = 0;
  • メモリ上には単一のコピーのみが存在し、全オブジェクトで共有される
  • クラス名とスコープ解決演算子(Point::count)を使ってアクセスできる
  1. C++の静的(static)ストレージクラスとは?使い方と動作を実例で解説

    staticストレージクラスとは C++のstatic(静的)ストレージクラスをローカル変数に指定すると、スコープに入るたびに生成し、抜けるたびに破棄するという通常の動作の代わりに、プログラムが終了するまでその変数を存続させ続けるようコンパイラに指示します。そのため、ローカル変数をstaticとして宣言すれば、関数呼び出しをまたいで値を保持できるようになります。 static修飾子はグローバル変数にも適用できます。この場合、その変数のスコープは宣言されたファイル内に限定されます。同じプログラム内の他のソースファイルからは参照できなくなるため、意図しない名前の衝突を防ぐのに役立ちます。 さらにC

  2. C#の静的メンバー(staticメンバー)とは?特徴と使い方を実例で解説

    C#における静的メンバーの基本C#では、staticキーワードを使うことで、クラスのメンバーを「静的メンバー」として定義できます。クラスのメンバーをstaticとして宣言すると、そのクラスからいくつのオブジェクト(インスタンス)を作成しても、静的メンバーの実体は常に1つだけであることを意味します。つまり、staticキーワードは「そのメンバーがクラスに対してただ1つだけ存在する」ことを表しています。この特性を活かし、静的変数は定数の定義などによく使われます。静的変数には、クラスのインスタンスを生成しなくても、クラス名を指定するだけで直接アクセスできるという利点があります。また、静的変数はメンバ