グローバルな領域(大域)に静的変数や静的関数を作る事はできましたが、
クラス内にも静的メンバ変数や静的メンバ関数を作る事ができます。
キーワードは、グローバルな領域に作る時と同じように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を呼び出す例です。
クラスのインスタンスがある場合は、
インスタンス名.静的メンバ関数名でアクセスできますが、
クラスのインスタンスがない場合でも、
クラス名::静的メンバ関数名とすれば、アクセスできます。