C++関数呼び出しの静的メンバー関数

1338 ワード

まず、以下のクラスAを定義する.
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を使用して、このメンバー関数の宣言をグローバルな非メンバー関数と同様にユニークに変更します).