メンバーを指すポインターを使用すると、クラス・オブジェクトの非静的メンバーを参照することができます。 メンバーを指すポインターを使用して静的クラス・メンバーを指すことはできません。 静的メンバーのアドレスは、特定のオブジェクトに関連付けられていないからです。 静的クラス・メンバーを指すためには、標準のポインターを使用することが 必要です。
メンバー関数を指すポインターは、関数を指すポインターと同じ方法で使用すること ができます。メンバー関数を指すポインターを比較し、値を割り当て、さらにそれらを使用して メンバー関数を呼び出すことができます。メンバー関数の型は、番号、引数の型、および戻りの型が 同じ非メンバー関数と同じではないことに注意してください。
#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 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 によって指示される関数を呼び出す際は 小括弧を使用することが必要です。
メンバーを指すポインターの変換は、メンバーを指すポインターの変換が初期化、割り当て、 または比較されるときに行われます。 メンバーを指すポインターは、オブジェクトを指すポインターまたは関数を指すポインターと 同じではありません。