函数指针
一、函数指针
1. 函数类型:由它的返回类型和形参类型共同决定(与函数名无关)
2. 示例:
int fun1(int a, int b) { return a + b; }
该函数的函数类型为:int (int, int)
3. 声明一个指向函数的指针:int (*pf)(int, int);
4. 函数名:作为一个值来使用时,该函数自动转换成指针
5. 为函数指针赋值:pf = fun1 或 pf = &fun1 //&是可选的,pf指向名为fun1的函数
6. 为函数指针赋值nullptr:表示该指针没有指向任何一个函数
二、函数指针作为形参
1. 形参若是函数类型,会自动转换成指向函数的指针
2. 对应的实参是函数,函数会被自动转换成指向该函数的指针
3. 示例:
void print(int (*pf)(int, int)); void print(int pf(int, int)); //形参为函数类型,自动转换成函数指针
4. 简化(类型别名):
//Func是函数类型
typedef int Func(int, int);
typedef decltype(fun1) Func;
//pFunc是函数指针
typedef int(*pFunc)(int, int);
typedef decltype(fun1) *pFunc;
5. 解读:decltype返回函数类型,此时不会将函数类型自动转换为指针类型,故上面的pFunc前才会加上“*”
6. 简化示例:
void print(pFunc); void print(Func); //形参为函数类型,自动转换成函数指针
三、返回类型为函数指针
1. 类型别名法
using pf = int (*)(int, int); //pf是函数指针
using f = int(int, int); //f是函数类型
pf func(parameter_list);
f *func(parameter_list);
2. 直接法
int (*func(parameter_list))(int, int);
3. 尾置返回类型
auto func(parameter_list) -> int (*)(int, int);
4. 使用decltype
前提:知道返回的函数是哪一个
int fun1(int a, int b);
int fun2(int a, int b);
//func返回指向fun1或者fun2的指针
decltype(fun1) *func(parameter_list);
重申:将decltype作用于某个函数时,它返回函数类型而非指针类型。
补充:具体返回指向f1的指针还是返回指向f2的指针,根据func函数体内的返回值而定。类似的例子——传说门。