C++ static メンバ関数の使い方

グローバルな領域(大域)に静的変数や静的関数を作る事はできましたが、
クラス内にも静的メンバ変数静的メンバ関数を作る事ができます。

キーワードは、グローバルな領域に作る時と同じようにstaticを付けます。

ここでは、静的メンバ関数の説明をしています。
静的メンバ変数の説明はコチラです。
通常のstatic付き静的関数の説明はコチラです。

静的メンバ関数

クラスの中にstatic付きで定義された関数は、静的メンバ関数となります。

静的メンバ関数の特徴は以下の通りです。

静的メンバ関数には、thisポインタが渡されません
thisポインタについてはコチラ

そのため、通常、静的メンバ関数内から
同クラス内のメンバ変数にアクセスする事ができません。

ただ、静的メンバ変数へはアクセス可能です。

また、同クラス内のstaticが付かないメンバ関数にもアクセスできません。

このような制限があるため、
通常、静的メンバ関数では、静的メンバ変数を扱う使い方が一般的な方法です。

記述例

ファイル名:hito.h

class hito {
public:

static int sint;

static void show();

};

ファイル名:hito.cpp

#include <iostream>
#include "hito.h"

using namespace std;

int hito::sint = 0;

void hito::show() {
      cout << "sintの値は" << hito::sint << "です" << '\n';
}

静的メンバ関数は、ヘッダファイル内にstatic付きで定義します。

静的メンバ関数の実装は、ソースファイル内で行います。

この時にキーワードstaticを付ける必要はありません。

と言うか、付けてはいけません。(コンパイルエラーが出ます。)

スポンサーリンク

使用例

先程のヘッダファイル:hito.hと
ソースファイル:hito.cppが組み込まれているモノとして説明します。

ファイル名:main.cpp

#include "hito.h"

void main() [
      hito a;
      hito b;

      a.sint = 10;
      b.sint = 20;
      hito::sint = 30;

      a.show();
      b.show();
      hito::show();

}

この例では、クラスhitoのインスタンスa、bをつくり、
それぞれ、静的メンバ変数へ代入を行い、
静的メンバ関数showを呼び出す例です。

クラスのインスタンスがある場合は、
インスタンス名.静的メンバ関数名でアクセスできますが、

クラスのインスタンスがない場合でも、
クラス名::静的メンバ関数名とすれば、アクセスできます。