4

私はC ++の初心者で、最近関数のポインターを学習していますが、関数のポインターの使用法に少し混乱しています。

私は次のコードを練習しました:

#include <iostream>
#include <sstream>
using namespace std;

int subtraction(int a,int b){
    return a-b;
}

int main(int argc, const char * argv[])
{

    int (*minus)(int,int)=subtraction;
    cout<<minus(5,4);

    return 0;
}

それはうまくいきます。だから、私は少しバリエーションを試します:

#include <iostream>
#include <sstream>
using namespace std;

int subtraction(int a,int b){
    return a-b;
}

int main(int argc, const char * argv[])
{

    int *minus(int,int)=subtraction;//only here different!
    cout<<minus(5,4);

    return 0;
}

私はMac上のXcodeでそれを練習しました.それは私にエラーを与えます:

不正な初期化子 (変数のみを初期化できます)

しかし、コンパイラは2つが同じであることを認識できると思いますが、なぜ括弧のペアが必要なのですか?

4

3 に答える 3

9

元のコードで

int (*minus)(int,int)=subtraction;

パラメータを取り、 を返す関数ポインタminusとして宣言します。int, intint

2番目のコードで

int *minus(int,int)=subtraction;

パラメータを取り、ポインタを返す関数minusとして宣言します。int, intint *

関数名 (関数ポインターに自動的に変換される) を使用して関数ポインターを初期化することはできますが、関数を初期化することはできません。

于 2013-09-23T06:26:23.070 に答える
3

これは、演算子の優先順位の問題です。関数呼び出し演算子 () は、逆参照演算子 * よりも優先されます。したがって、括弧を使用して正しい評価順序を指定する必要があります。

int *minus(int, int)

意味: まず、minus という名前の関数を呼び出してから、戻り値 (この場合は int*) を逆参照します

int (*minus)(int, int)

意味: 最初に関数を返す「minus」を逆参照してから、その関数呼び出します。

于 2013-09-23T06:43:13.437 に答える
3

コードにタグを付けてC++使用しiostreamているため、C++ ソリューションを探していると推測できます。

std::functionこのようなシナリオでは、エラーが発生しやすい関数ポインター構文ではなく、クラス テンプレートを使用することをお勧めします。

#include <iostream>
#include <sstream>
#include <functional>


int subtraction(int a,int b){
    return a-b;
}

int main(int argc, const char * argv[])
{
    std::function<int(int,int)> minus = subtraction;
    //int (*minus)(int,int)=subtraction;
    std::cout<<minus(5,4);

    return 0;
}

または、関数へのポインターを引き続き使用する場合は、typedef をお勧めします

#include <iostream>
int subtraction(int a,int b){
    return a-b;
}
typedef int (*MINUS)(int,int);
int main(int argc, const char * argv[])
{
    MINUS minus = subtraction;
    //int (*minus)(int,int)=subtraction;
    std::cout<<minus(5,4);

    return 0;
}

最後に、広く使用されているもう 1 つのオプションは、ファンクターを使用することです。

#include <iostream>
struct MINUS
{
    int operator()(int a,int b){
        return a-b;
    }
};
int main(int argc, const char * argv[])
{
    //int (*minus)(int,int)=subtraction;
    MINUS minus;
    std::cout<<minus(5,4);

    return 0;
}
于 2013-09-23T06:50:00.267 に答える