定义函数指针的三种形式
形式1:typedef std::function<返回值(形参类型)> 别名
例:
typedef std::function<void (int ,int)> myfunction1;
这种比较好理解,定义一种返回值为void,形参1为int,形参2为int,这种类型的函数指针,并为这种指针取名为myfunction1;使用的时候也像平时定义普通变量一样去使用就行;
形式2:typedef 返回值类型 (*别名)(形参类型);
例:
typedef void (*myfunction2)(int ,int );
这种也比较好理解,定义一种返回值为void,形参1为int,形参2为int,这种类型的函数指针,并为这种指针取名为myfunction2,但是要记住这是一个指针,使用的时候函数名相当于地址,也就是说需要把函数名赋给它就行了;使用的时候需要解引用。
形式3:返回值类型 (*别名)(形参类型)
例:
void (*myfunction3)(int,int);
这种更是直截了当,但是与前面不同的是,这里是定义了一个函数指针,并非一种,其他方面跟第二种定义的函数指针一样。
使用示例
#include<iostream>
#include<functional>
using namespace std;
typedef std::function<void (int ,int)> myfunction1;//定义一种函数指针
typedef void (*myfunction2)(int ,int );//定义一种函数指针
void (*myfunction3)(int,int);//定义一个函数指针
//从指针层面上理解该函数,即函数的函数名实际上是一个指针,
//该指针指向函数在内存中的首地址
void add (int a ,int b )
{
cout<<a<<"+"<<b<<"="<<a+b<<endl;
}
int main(){
myfunction1 fun1;
myfunction2 fun2;
fun1 = add;
fun2 = add;
myfunction3 = add;
cout<<"使用第一种形式调用:"<<endl;
fun1(1,2);
cout<<"使用第二种形式调用:"<<endl;
(*fun2)(1,2);
cout<<"使用第三种形式调用:"<<endl;
(*myfunction3)(1,2);
return 0;
}