ポインターは、メンバーへのthis
ポインターに沿って格納されません (メンバー関数ポインターは、この特殊なケースです)。あなたがするだけなら
void (MyObject::*f)( int, int ) = &MyObject::method_that_takes_two_ints;
保存されるのは、後で提供する必要があるオブジェクトでどのメンバー関数を呼び出す必要があるかという情報だけです。それを呼び出したい場合は、コンパイラがthis
ポインタを取得するオブジェクトを渡す必要があります。
MyObject o; (o.*f)(1, 2);
メンバー関数ポインターは、(指されている) 型が関数型であるメンバー ポインターです。標準では、メンバー関数ポインターには、それらが指す独自の「メンバー関数型」がなく、何らかの形で this ポインター型が含まれると述べています。
int main() {
typedef void fun() const;
fun MyObject::*mem_function_ptr =
&MyObject::const_method_that_takes_two_ints;
}
fun
そのコードでは関数型です。「通常の」関数が持つタイプ。メンバー関数ポインターとは対照的に、関数へのポインターは、その型を持つ関数への単なるポインターです。
void foo() { cout << "hello"; }
int main() {
typedef void fun();
fun * f = &foo;
}
メンバー関数へのポインターには、その関数型の上に追加のメンバーポインターレベルがあります。
ポインターと、それが指しているオブジェクトとの関係についての何かthis
(技術的ではなく、理論的なもの):
各メンバー関数には、 const または非 const メンバー関数があるかどうかに応じて、implicit object parameter
型を持つ、MyObject&
またはという隠しパラメーターがあります。MyObject const&
メンバー関数を呼び出すオブジェクトo
はimplied object argument
、パラメーターに渡される です。メンバー関数の呼び出し方法を記述する規則を構成する標準の理論では、暗黙的なオブジェクト パラメーターは最初の隠しパラメーターです。これは概念的なものであり、実装における実際のケースであるという意味ではありません。次に、暗黙のオブジェクト引数がその暗黙のオブジェクト パラメーターにバインドされ、暗黙の変換が発生する可能性があります (そのため、非 const オブジェクトで const メンバー関数を呼び出すと、修飾変換が からMyObject
に変換されます)。MyObject const&
. これが、非 const オブジェクトの場合、非 const 関数を呼び出すよりも非 const 関数の方が適している理由です)。たとえば、次のコードで言うことができます。
struct A {
operator int() const { return 0; }
};
int main() {
A a;
int i = a; // implicit conversion using the conversion function
}
type の暗黙のオブジェクト引数a
が typeA
の暗黙のオブジェクト パラメーターにバインドされA const&
、そのオブジェクトがここthis
で型を持つポインターによってポイントされるA const*
こと。注意すべき重要なことは、暗黙的なオブジェクト パラメーターは理論上の構成要素にすぎず、メンバー関数を呼び出すための規則がどのように構成されているかを形式化する (そしてコンストラクターにはそれらが含まれていない) 一方で、 this ポインターは実際に存在するということです。が導入されたとき、C++ にはまだ参照がなかったthis
ので、 はポインターです。this
それが問題を理解するのに役立つことを願っています。