3

クラスのメンバーへのポインタが必要な場合は、次のようにします

struct MyStruct
{
    int foo();
};

int (MyStruct::*p)() = &MyStruct::foo;

私の質問は、 & 演算子を使用してアドレスを取得する必要があるのはなぜですか。これは、静的関数の場合は無視される可能性があります。また、メンバーへのポインターは実際にはポインターではないと聞きました。誰かがそれを明確にできますか?

4

2 に答える 2

6

静的関数の場合は、通常の非メンバー関数ポインターと同じように機能します。関数名自体を関数ポインターに暗黙的に変換できます。

非静的メンバー関数の場合、非メンバー関数と同じではなくなります。

  1. 隠しthisパラメーターがあります。
  2. 多重継承のシナリオでは、基本クラスの 1 つへのポインターを変換すると、別のアドレスへのポインターが生成される場合があります。これは、メンバー関数が継承されている場合this、呼び出しの前にポインターを調整する必要がある場合があることを意味します。これにより、ポインターを使用してメンバー関数へのポインターを格納することができなくなります。

Raymond Chenは、これについて詳細と例を含む興味深い記事を書いています。

于 2011-12-20T06:32:17.030 に答える
-2

& 演算子を使用してアドレスを取得する必要があるのはなぜですか。これは、静的関数の場合は無視される可能性があります

そうです、メンバー関数構文へのポインターの場合、理想的&には省略できます。&構文は、歴史的な慣習によるものかもしれません

メンバーへのポインターは実際にはポインターではないと聞いたことがありますが、誰かがそれを明確にすることができますか?

それは正しくありません。唯一の違いは、メンバー関数へのポインターであることです。class非静的メンバーには引数として暗黙 のポインターが含まれているためthis、特別な署名があります。また、同じシグネチャを持つ通常の関数ポインタと相互変換することはできません。

あなたのコード例では、理論的には次pを指しています:

int MyStruct::foo (MyStruct* const);
于 2011-12-20T06:39:14.293 に答える