C++関数呼び出しの静的メンバー関数
まず、以下のクラスAを定義する.
上記のクラスの定義には、静的メンバー変数val_が含まれていることがわかります.sと静的メンバー関数getVal()です.
静的メンバー変数の場合、一般にnon-publicとして宣言されます.つまり、クラス外でメンバー変数にアクセスする必要がある場合は、メンバー関数インタフェースを提供する必要があります.
一方、静的メンバー変数はクラスから独立したオブジェクトであり、すべてのクラスのオブジェクトが共有する部分である.つまり、静的メンバー変数を操作する関数があれば、この関数には隠されたthisポインタがないことを意味する.これは一般的なメンバー関数とは異なり(一般的なメンバー関数にはthisポインタがある)、staticメンバー関数が誕生します.
このようなstaticメンバー関数は、次の要件を満たす必要があります.
1 staitc以外のメンバー変数は操作できません
2 const,volatileまたはvirtualとして宣言できません.
3クラスのオブジェクトを介して呼び出す必要はありません.(クラスのオブジェクトを使用して呼び出すのも合法ですが).
実際、コンパイラは、non-memberメンバー関数をコンパイラが処理しているように、静的メンバー関数に直面するときに、そのメンバー関数をグローバル関数として呼び出します.(ここでもname mabglingを使用して、このメンバー関数の宣言をグローバルな非メンバー関数と同様にユニークに変更します).
class A
{
private:
static int val_s;
public:
static int getVal(){cout << "call getVal in A..." << endl;return val_s;}
};
上記のクラスの定義には、静的メンバー変数val_が含まれていることがわかります.sと静的メンバー関数getVal()です.
静的メンバー変数の場合、一般にnon-publicとして宣言されます.つまり、クラス外でメンバー変数にアクセスする必要がある場合は、メンバー関数インタフェースを提供する必要があります.
一方、静的メンバー変数はクラスから独立したオブジェクトであり、すべてのクラスのオブジェクトが共有する部分である.つまり、静的メンバー変数を操作する関数があれば、この関数には隠されたthisポインタがないことを意味する.これは一般的なメンバー関数とは異なり(一般的なメンバー関数にはthisポインタがある)、staticメンバー関数が誕生します.
このようなstaticメンバー関数は、次の要件を満たす必要があります.
1 staitc以外のメンバー変数は操作できません
2 const,volatileまたはvirtualとして宣言できません.
3クラスのオブジェクトを介して呼び出す必要はありません.(クラスのオブジェクトを使用して呼び出すのも合法ですが).
#include
using namespace std;
class A
{
private:
static int val_s;
public:
static int getVal(){cout << "call getVal in A..." << endl;return val_s;}
};
int A::val_s = 4;
int main(void)
{
cout << ((A *)0)->getVal() << endl; // static
A a;
cout << a.getVal() << endl; //
cout << A::getVal() << endl; //
return 0;
}
実際、コンパイラは、non-memberメンバー関数をコンパイラが処理しているように、静的メンバー関数に直面するときに、そのメンバー関数をグローバル関数として呼び出します.(ここでもname mabglingを使用して、このメンバー関数の宣言をグローバルな非メンバー関数と同様にユニークに変更します).