クラスのメンバーへのポインタが必要な場合は、次のようにします
struct MyStruct
{
int foo();
};
int (MyStruct::*p)() = &MyStruct::foo;
私の質問は、 & 演算子を使用してアドレスを取得する必要があるのはなぜですか。これは、静的関数の場合は無視される可能性があります。また、メンバーへのポインターは実際にはポインターではないと聞きました。誰かがそれを明確にできますか?
クラスのメンバーへのポインタが必要な場合は、次のようにします
struct MyStruct
{
int foo();
};
int (MyStruct::*p)() = &MyStruct::foo;
私の質問は、 & 演算子を使用してアドレスを取得する必要があるのはなぜですか。これは、静的関数の場合は無視される可能性があります。また、メンバーへのポインターは実際にはポインターではないと聞きました。誰かがそれを明確にできますか?
静的関数の場合は、通常の非メンバー関数ポインターと同じように機能します。関数名自体を関数ポインターに暗黙的に変換できます。
非静的メンバー関数の場合、非メンバー関数と同じではなくなります。
this
パラメーターがあります。this
、呼び出しの前にポインターを調整する必要がある場合があることを意味します。これにより、ポインターを使用してメンバー関数へのポインターを格納することができなくなります。Raymond Chenは、これについて詳細と例を含む興味深い記事を書いています。
& 演算子を使用してアドレスを取得する必要があるのはなぜですか。これは、静的関数の場合は無視される可能性があります
そうです、メンバー関数構文へのポインターの場合、理想的&
には省略できます。&
構文は、歴史的な慣習によるものかもしれません。
メンバーへのポインターは実際にはポインターではないと聞いたことがありますが、誰かがそれを明確にすることができますか?
それは正しくありません。唯一の違いは、メンバー関数へのポインターであることです。class
非静的メンバーには引数として暗黙 のポインターが含まれているためthis
、特別な署名があります。また、同じシグネチャを持つ通常の関数ポインタと相互変換することはできません。
あなたのコード例では、理論的には次p
を指しています:
int MyStruct::foo (MyStruct* const);