在当我们定义一个函数时,我们一定都想过一个问题,函数是否也和变量那样,有地址,可以作为函数的一个参数来调用呢?答案是肯定的。那么如果能够将a函数作为一个参数传入b函数,那么这个b函数的弹性会得到大大提升,这也是函数指针的一种重要用法。
函数指针的定义:普通定义:typename(*+函数名)(函数参数)
用vector定义:vector<typename(*+函数名)(函数参数)>+vector名
具体使用方法见代码:
#include<iostream>
int add(int a, int b)
{
return a + b;
}
int main()
{
int(*p)(int, int)=add;
//p = add;
int a = 1, b = 2,c;
c = p(a, b);
std::cout << c;//3
}
再举个栗子,给定了我们一个程序,让我们想要在两个整形数字相加之前,先判断这俩数字大小,可是没有明确如果a>b的话就不执行该函数,或者是a<b的话就不执行,在这种模糊的问题说明下,如果我们贸然在函数里面写>或<,这会出麻烦的,因此此时函数作为参数是非常合适的。
#include<iostream>
int add(int a, int b, bool (*p)(int, int))
{
if (p(a, b))
return a + b;
else
{
std::cout << "error";
return -1;
}
}
bool Isbig(int a, int b)
{
return a > b ? true : false;
}
bool Issmall(int a, int b)
{
return a <b ? true : false;
}
int main()
{
int x, y;
std::cin >> x >> y;
int c=add(x, y, Isbig);
//intc=add(x,y,Issmall);如果想判断小就可以通过控制改变这一个参数即可
std::cout << c;
}
结果演示:
1 3
error-1
3 1
4
注:函数指针里我们可以直接通过函数名(也就是地址)来直接调用这个函数,没必要进行寻址操作;作为参数的函数有几个参数,要表明,int add(int a, int b, bool (*p)(int, int))。并且函数如果要用普通指针,如:bool*p=Issmall是错误的,一定要用函数指针形式定义的指针才可以。
当然这种方法也不是最优解,可以通过function函数对象库里面所定义的重载函数来更好的解决这个问题。