函数指针指向的是函数而非对象.和其他指针一样,函数指针指向某种特定类型.函数的类型由它的返回类型和形参类型共同决定,与函数名无关.
1 | bool lengthCompare(const string &a, const string &b) { |
当把函数名作为一个值使用时,该函数自动转换为指针,所以, pf = lengthCompare和 pf1 = &lengthCompare是等价的.
函数指针作为实参
不能定义函数类型的形参,但是形参可以是指向函数的指针
1 | // 第三个形参是函数类型,它会自动转换为指向函数的指针 |
定义函数类型别名和函数指针类型别名
decltype返回函数类型,不会将函数类型自动转换为指针类型
1 | // Func和Func2是函数类型 |
useBigger的另外两种等价的声明(使用了类型别名)
1 | void useBigger(const string &s1, const string &s2,Func); |
返回函数指针
1 | using F = int(int*, int); // F是函数类型,不是指针 |
使用类型别名定义返回类型为函数指针的函数
1 | PF f1(int); // PF是指向函数的指针,f1返回指向函数的指针 |
首先f1有形参列表,所以,f1是个函数,f1的返回值是一个指针。该指针也有形参列表,所以,该指针指向函数。此指针指向的函数的形参是int*和int,返回int。所以,f1是一个返回一个函数int(*)(int *,int)的函数。
一个复杂点的例子
1 | string::size_type sumLength(const string &a, const string &b) { |
由于函数的类型由它的返回类型和形参类型决定,而与函数名无关,可知sumLength和largerLength属于相同的类型。所以,我们可以向getFcn传入参数,获取指向同一种函数类型的不同的函数指针。