在c++中, 函数指针虽然并不常用, 但还是非常有必要了解的
1.函数指针和其他指针一样, 指向某种特定类型. 函数指针的类型由它的返回类型和形参类型共同决定, 与函数名无关, 例如:
bool lengthCompare(const string&, const string&);
bool (*pf)(const string&, const string&); // 未初始化
2.把函数名作为一个值使用时, 该函数自动地转换成指针.例如
pf = lengthCompare;
pf = &lengthCompare;
3.函数指针作为形参的写法
// 虽然第三个形参是函数类型, 但它会自动转换成指向函数的指针
void useBigger(const string &s1, const string &s2,
bool pf(const string&, const string&);
void useBigger(const string &s1, const string &s2,
bool (*pf)(const string&, const string&);
直接使用函数指针类型显得冗长而繁琐, 可以为它定义类型别名, 通常我们使用第三种写法
// func和Func2是函数类型
typedef bool func(const string&, const string&);
typedef decltype(lengthCompare) Func2;
// FuncP和FuncP2是指向函数的指针
typedef bool(*FuncP)(const string&, const string&);
typedef decltype(lengthCompare) *FuncP2;
此时, useBigger可以重新声明为
void useBigger(const string&, const string&, Func);
void useBigger(const string&, const string&, FuncP2)
例如我们要定义一个形参为一个int, 返回一个FuncP类型的函数,代码如下
FuncP f1(int); // 正确
func *f1(int); // 正确
func f1(int); // 错误
6.类的成员函数指针
必须注意的是,:
在定义类的成员函数指针时, 必须加上"类名::", 而调用类的非静态函数时都有一个隐含的this指针, 如果使用this调用, 则格式为(this->*pFunc)(实参列表),
或(该类对象指针->*pFunc)(实参列表)
假如CTest类有函数func1~func3和 invoke, invoke函数内部可能需要调用func1~func3中的其中一个, 我们的代码如下
class CTest
{
public:
CTest();
private:
void func1()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
void func2()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
void func3()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
typedef void (CTest::*FuncPointer)();
void invoke(FuncPointer func)
{
(this->*func)();
}
};