4

次のような 3 つの機能があります。

float Plus    (float a, float b) { return a+b; }
float Minus   (float a, float b) { return a-b; }
float Multiply(float a, float b) { return a*b; }

現在、引数の1つとして関数へのポインタを取る関数があります:-

void Function_Pointer_func(float a, float b, float (*pt2Func)(float, float))
{
   float result = pt2Func(a, b);    // call using function pointer

   cout << " Result = ";  // display result
   cout << result << endl;
}

上記の関数「Function_Pointer_func」を呼び出すには、関数を以下に記述します

void Replace()
{ 
   Function_Pointer_func(2, 5, /* pointer to function 'Minus' */ Plus);////   (1)
   Function_Pointer_func(2, 5, /* pointer to function 'Minus' */ &Minus);//// (2)

}

関数「Function_Pointer_func」が関数ポインターを引数として取るため、上記の関数が正常に機能するのはなぜですか。そして、RHSをインラインで置き換えると

 float result = pt2Func(a, b);    // call using function pointer 

(*pt2Func)(a, b); による関数 "Function_Pointer_func" の場合も機能しますが、(&pt2Func)(a, b); の場合は機能します。

VS2008 でエラーが発生します。

"エラー C2064: 項は 2 つの引数を取る関数として評価されません"

ここで、関数「Function_Pointer_func」の「float (*pt2Func)(float, float)」の引数を float (pt2Func)(float, float) に置き換えてから、3 つすべてを置き換えます。

float result = pt2Func(a, b);    // 
float result = (&pt2Func)(a, b); // 
float result = (*pt2Func)(a, b); // 

ステートメントは機能しますが、なぜですか? 私の不快感の理由が、関数ポインタの核となる理解を理解することにあることを願っています。さて、私はQを提示していませんか?十分な量の読書はありませんが、はい、これについて集中的な調査を行っていないので、この点に関して、私のあいまいさを整理する読書をお気軽にお勧めしてください。

事前に助けてくれてありがとう。

4

2 に答える 2

2

関数は自動的に関数ポインターに分解されます。その文脈では、

  • function_name指定されていない場合は本当に意味し&function_nameます。

  • &function_name関数を関数ポインタに変換します。

  • *function_name*(function_name)上記のとおりになります*(&function_name)。いわば「キャンセル」し、結果*はに減衰します。&function_name&function_name

于 2013-08-12T17:33:35.583 に答える