简体   繁体   中英

usage on c++ function pointer

I'm a newbie to C++, learning pointer of function recently, a little confused by usage of pointer of function;

I practiced the following code:

#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;
}

it works well; so,I try a little variation:

#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;
}

I practiced it in Xcode on Mac,it give me Error:

Illegal initializer (only variables can be initialized)

but I think compiler can recognized the two is same,why must have a pair of parenthesizes?

In your original code

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

declares minus as a function pointer that takes parameter int, int and returns int .

In your second code

int *minus(int,int)=subtraction;

declares minus as a function that takes parameter int, int and returns a pointer int * .

You can use a function name(which is automatically converted to a function pointer) to initialize a function pointer, but you can't initialize a function.

This is a matter of operator precedence . The function call operator () has a higher precedence than the dereference operator *. So you must use parentheses to specify the correct order of evaluation.

int *minus(int, int)

means: First call a function named minus, then dereference the return value (int* in this case).

int (*minus)(int, int)

means: First dereference "minus", which returns a function, and then call that function.

You have tagged your code C++ and using iostream so I can safely assume you are looking for a C++ solution.

In such scenario, its best to use class template std::function instead of the function pointer syntax that is prone to error.

#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;
}

Alternatively, if you would still want to continue with pointer to function, typedefs are recommended

#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;
}

And finally, another widely used option is to use functors.

#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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM