天天看点

C++primer学习笔记-----6.7函数指针

【函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。 函数的类型由它的返回类型和形参类型共同决定,与函数名无关。

bool lengthCompare(const string &, const string &); // 该函数的类型是bool(cosnt string &, const string &)
bool (*pf)(const string &, const string &); // (未初始化)要想声明一个可以指向该类型函数的指针,只需要用指针替换函数名即可
           

【当我们把函数名作为一个值使用时,该函数自动地转换成指针(函数名作为右值使用时可省略取地址符):

pf = lengthCompare;
pf = &lengthCompare; // 等价赋值,取地址符是可选的
           

我们还能直接使用指向函数的指针调用该函数,无须提前解引用指针( 使用函数指针调用其指向的函数可以省略解引用符):

bool b1 = pf("hello", "goodbye");
bool b2 = (*pf)("hello", "goodbye"); // 可选的解引用符
bool b3 = lengthCompare("hello", "goodbye"); // 这三条语句调用了相同的函数
           

指向不同类型函数的指针间不存在转换规则,我们可以为函数指针赋一个nullptr 或者值为0 的整形常量表达式,表示该指针没有指向任何一个函数。】

【重载函数的指针:

当我们使用重载函数的指针时,上下文必须清晰地界定到底应该选用哪个函数;(比如不允许auto p = &func,如果func是重载函数的话)

编译器通过指针类型决定选用哪个函数,指针类型必须与重载函数中的某一个精确匹配。(故使用指针调用函数时不存在选择的问题)】

【函数指针形参:

和数组类似,虽然不能定义函数类型的形参,但是形参可以是指向函数的指针。此时,形参看起来是函数类型,实际上当成指针使用。

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 &)); // 两条等价的声明
           

【返回指向函数的指针:

返回类型不会自动转换成指针,因此形式上不能定义成返回类型为函数的函数。

auto f1(int) -> int (*)(int *, int); // 使用尾置返回类型的方式声明函数
int (*f1(int))(int *, int); 
PF f1(int); // 事先把PF 类型声明为指向函数的指针
           

【可以将auto,decltype,类型别名等方式用于简化函数指针的声明,形参中的函数指针,返回函数指针的函数声明。

使用decltype 作用于某个函数时,它返回函数类型而非指针类型。】

继续阅读