2011-12-08 13 views
2

私が理解しているように、メソッドは実際には暗黙の余分なパラメータ(thisポインタ)を持つ関数であり、静的メソッドは空き関数とほとんど同じです。メソッドとフリー関数の微妙な違いは何ですか?

しかし、方法と機能にはいくつかの違いがあるようです。たとえば、関数を引数として渡すときに、参照演算子&をメソッドで使用する必要がありますが、空き関数で使用する必要はありません。

foobar(&MyClass::method); 
goobar(freefunction); 

メソッドとフリー機能の間には、他に微妙な技術的違いがありますか?

+0

私はC++ FAQをコピー&ペーストすることができましたが、[it](http://www.parashift.com/c++-faq-lite/pointers-to-members.html) – stonemetal

+0

と重複している可能性があります[Errorカッコで囲まれたメンバ関数のアドレス](http://stackoverflow.com/questions/7134 197/error-of-parenthesized-member-functionのあるアドレス) – Nawaz

答えて

3

foobar(&MyClass::method);

... &は、 "参照演算子" ではありませんが、アドレス演算子です。そのオペランドのアドレスをとります。

あなたが実際にはまだ、このような(暗黙の型変換が可能ですが)のようにコード内で自由に関数のアドレスを取る「しなければならない」ん:

goobar(freefunction); 

として表現は、このような原因となる可能な暗黙の型変換があります。 Fooがポインタに壊れてしまいましたが、MSVCに問題がない場合には、GCCにこのようなコードのエラーや警告を受けさせるのが非常に難しかったです。

  1. staticメンバ関数は、クラスのインスタンスで動作し、かつ点thisポインタがある:これとは別に

    、フリー機能や非静的メンバ関数の間の2つの主な違いがありますクラスそのものに

  2. フリー・ポインタ関数を使用して作成および呼び出しする構文は、メンバ関数へのポインタの構文とは異なります。
  3. フリー機能の場合

、構文は自明である(っぽい):

void foo(); // Function declaration 
void(*f)(); // Declaration of pointer-to-function-returning-void-and-taking-no-parameters 

しかし、メンバ関数へのポインタの場合、構文はかなりトリッキーです:

struct Bar 
{ 
    void DoIt() 
    { 
    } 
    void DoThat(int n) 
    { 
    n; 
    } 
}; 


void(Bar::*thatfn)(int); // declares a pointer-to-member-function taking int returning nothing 
thatfn = &Bar::DoThat;  // initializes pointer to point to DoThat(int) 
(bar.*thatfn)(42);   // call the function 
+0

"しかし、多くのコンパイラはこの点では寛容ではありません。" - 間違って、標準では、自由な関数が帽子のドロップでポインタに崩壊するので、あなたがする必要はないと具体的に述べています。 – Xeo

+0

@ Xeo:Linuxでは暗黙的に分解するのが難しかったですが、MSVCにはこのような問題はありません。 –

+0

@えええええええええええええええええええええええええええええええええええええええええええええええ、私は自分の言葉を編集して、木の葉に焦点を当てた人々にあまり攻撃的でないようにしました;) –

1

私はそれが原因であると思うと言う(§5.3.1/ 3)、

部材へのポインタのみ明示&を用いた場合に形成され、そのオペランドが修飾-IDではありませんかっこで囲まれています。

し、それは、このように説明することに進む。

[注:つまり、修飾-idが括弧で囲まれている式&(修飾-ID)は、ないし"member to pointer"型の式を形成します。非スタティックメンバ関数の修飾IDから、メンバ関数へのポインタへの暗黙的な変換がないため、qualified-idもありません。型を "関数へのポインタ"(4.3)にタイプします。 & unqualified-idも、unqualified-idのクラスのスコープ内であってもメンバーへのポインターではありません。 ]


私はちょうど2つの興味深いトピックはヨハネスの答えは特に@、これを議論しました素敵ここで読む:

と同様に、この1:

また、このトピックは、重複しているように見えるので、このトピックを投票してください。で

+0

私は、この質問がこれらの質問の欺瞞であることに同意します。http://meta.stackexchange.com/questions/109993/guidelines-for-クローズド・クエスチョン・ア・ファクト・デュプリケート –

関連する問題