重点:
1.函数指针指向的是函数而非对象,函数的类型由它的返回类型和形参类型共同决定,与函数名无关。
2.要想声明一个可以指向该函数的指针,只需要用指针替换函数名即可。
NOTE:*pf两端的括号必不可少。如果不写这对括号,则pf是一个返回值为bool指针的函数:
//声明一个名为pf的函数,该函数返回bool*;
Bool *pf ( const string & , const string & );
3.当我们把函数名作为一个值使用时,该函数自动地转换成指针。
将lengthCompare的地址赋给pf:
Pf = lengthCompare ; // pf指向名为lengthCompare的函数
Pf = &lengthCompare ;//等价的赋值语句:取地址符是可选的
此外,我们还能直接使用指向函数的指针调用该函数,无须提前解引用指针:
Bool b1= pf(“hello”,“goodbye”);//调用lengthCompare函数
Bool b2 = (*pf) (“hello”,“goodbye”) ;//一个等价的调用
Bool b3 = lengthCompare (“hello”,“goodbye”);//另一个等价的调用
4.在指向不同函数类型的指针间不存在转换规则。
5.如果定义了指向重载函数的指针,编译器通过指针类型决定选用哪个函数,指针类型必须与重载函数中的某一个精确匹配。
6.和数组类似,虽然不能定义函数类型的形参,但是形参可以是指向函数的指针。
(我们可以直接把函数作为实参使用,此时它会自动转换成指针)
7.和数组类似,虽然不能返回一个函数,但是能返回指向函数类型的指针。
(我们必须显式地把返回类型写成指针形式,编译器不会自动地将函数返回类型当成对应的指针类型处理)
8.要想声明一个返回函数指针的函数,最简单的办法是使用类型别名:
Using F = int ( int* , int );//F是函数类型,不是指针
Using PF = int (*) ( int* , int );//PF是指针类型
和函数形参不一样,返回类型不会自动地转换成指针,必须显示地将返回类型定义为指针:
PF f1 ( int ); //正确:PF是指向函数的指针,f1返回指向函数的指针
F f1 ( int ); //错误:F是函数类型,f1不能返回一个函数
F *f1 ( int ); //正确:显式地指定返回类型是指向函数的指针
9.直接声明f1:
Int ( * f1 ( int ) ) ( int* , int );
尾置返回类型:
Auto f1 ( int ) -> int (*) ( int* , int );
10.decltype ( sumLength ) *getFc (const string & );
牢记当我们将decltype作用于某个函数时,它返回函数类型而非指针类型,因此,我们显示地加上*以表示我们需要返回指针,而非函数本身。