次のようなコードを時々見かけます。
class A {
int b;
}
void foo() {
int* blah = &A::b;
// Other stuff.
}
しかし、クラスのインスタンスなしでクラスのメンバー変数のアドレスを取得することは、どのように役立つでしょうか? それは何をするためのものか?
コードの形式が正しくないため、コンパイルできません。の型は ではblahなくint*ですint (A::*)。つまり、「へのポインター」ではなく、「型がintであるクラス型のデータ メンバーへのポインター」Aですint。
メンバーへのポインターを取得するには、メンバーにアクセスできる必要があることに注意してください。で計算する&A::bにはfoo()、bパブリック データ メンバーであるfoo()必要があるか、 のフレンドである必要がありAます。
メンバーへのポインターはオブジェクトを指しません。むしろ、メンバーへのポインターをオブジェクトにバインドして、そのデータ メンバーの値を取得できます。メンバへのポインタを のインスタンスにバインドすることによりb、オブジェクトのデータ メンバの値を取得できます。例えば、AblahA
A x;
int b_value = x.*blah; // b_value has the value of x.b
クラスAにはintがありbます。つまりb、クラスのデータです。のインスタンスがある場合は、へのAポインタを取得できます。bA
私はあなたがこのケースを求めたいと思います:
class A{
int foo(int i) {
}
}
コンパイル後、メソッドfooにはアドレスがあり、へのポインタを取得できます&A::foo。