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

来源:互联网 发布:sql server 2017 收费 编辑:程序博客网 时间:2024/04/28 19:03
【函数指针指向的是函数而非对象。和其他指针一样,函数指针指向某种特定类型。函数的类型由它的返回类型和形参类型共同决定,与函数名无关。
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 作用于某个函数时,它返回函数类型而非指针类型。】