メンバーへのポインターを使用すると、クラス・オブジェクトの非静的メンバーを参照することができます。
メンバーへのポインターを使用して静的クラス・メンバーを指すことはできません。
静的メンバーのアドレスは、特定のオブジェクトに関連付けられていないからです。
静的クラス・メンバーを指すためには、標準のポインターを使用する必要があります。
メンバー関数へのポインターは、関数へのポインターと同じ方法で使用することができます。 メンバー関数へのポインターを比較し、値を割り当て、さらにそれらを使用してメンバー関数を呼び出すことができます。 メンバー関数の型は、番号、引き数の型、および戻りの型が同じ非メンバー関数と同じではないことに注意してください。
メンバーへのポインターは、以下の例に示すように宣言し、使用することができます。
#include <iostream> using namespace std; class X { public: int a; void f(int b) { cout << "The value of b is "<< b << endl; } }; int main() { // declare pointer to data member int X::*ptiptr = &X::a; // declare a pointer to member function void (X::* ptfptr) (int) = &X::f; // create an object of class type X X xobject; // initialize data member xobject.*ptiptr = 10; cout << "The value of a is " << xobject.*ptiptr << endl; // call member function (xobject.*ptfptr) (20); }
この例の出力は次のようになります。
The value of a is 10 The value of b is 20
複雑な構文を簡単にするために、typedef がメンバーへのポインターであると宣言することができます。 メンバーへのポインターは、以下のコード・フラグメントに示すように宣言し、使用することができます。
typedef int X::*my_pointer_to_member; typedef void (X::*my_pointer_to_function) (int); int main() { my_pointer_to_member ptiptr = &X::a; my_pointer_to_function ptfptr = &X::f; X xobject; xobject.*ptiptr = 10; cout << "The value of a is " << xobject.*ptiptr << endl; (xobject.*ptfptr) (20); }
メンバーへのポインター演算子 .* および ->* は、特定のクラス・オブジェクトのメンバーへの ポインターをバインドする際に用いられます。 () (関数呼び出し演算子) の優先順位の方が .* および ->* よりも高いため、ptf によって指示される関数を呼び出す際は 小括弧を使用することが必要です。
関連参照