メンバーへのポインター

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 によって指示される関数を呼び出す際は 小括弧を使用することが必要です。

関連参照

IBM Copyright 2003