メンバーを指すポインター (C++ のみ)

メンバーを指すポインターを使用すると、クラス・オブジェクトの非静的メンバーを参照することができます。 メンバーを指すポインターを使用して静的クラス・メンバーを指すことはできません。 静的メンバーのアドレスは、特定のオブジェクトに関連付けられていないからです。 静的クラス・メンバーを指すためには、標準のポインターを使用することが 必要です。

メンバー関数を指すポインターは、関数を指すポインターと同じ方法で使用すること ができます。メンバー関数を指すポインターを比較し、値を割り当て、さらにそれらを使用して メンバー関数を呼び出すことができます。メンバー関数の型は、番号、引数の型、および戻りの型が 同じ非メンバー関数と同じではないことに注意してください。

メンバーを指すポインターは、以下の例に示すように宣言し、使用することができます。
#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 によって指示される関数を呼び出す際は 小括弧を使用することが必要です。

メンバーを指すポインターの変換は、メンバーを指すポインターの変換が初期化、割り当て、 または比較されるときに行われます。 メンバーを指すポインターは、オブジェクトを指すポインターまたは関数を指すポインターと 同じではありません。