C++函数(笔记三)

函数指针

一个指向了函数的指针

定义函数指针:

bool lengthCompare(const string &, const string &){};//定义一个函数
bool (*pf) (const string &, const string &) = lengthCompare//pf为指向lengthCompare的函数指针。(括号不能省略!!)然而,这一句代码中,lengthCompare前面还可以跟个取地址符,这是可选的,并不影响结果。

使用函数指针:

bool var1= pf(“hello”,”goodbye”);//正确
bool var2=(*pf)( “hello”,”goodbye”)//等价于无解引用
bool var3= lengthCompare ( “hello”,”goodbye”)//上面两行都是相当于这行的。

然而,函数指针不存在转换规则,换而言之:
bool cstringCompare(const char*, const char *);
pf = cstringCompare; 这是错误的。

还有个例子:

void ff(int *);
void ff(unsigned int);
void (*p1)(unsigned int)=ff;//正确 
void (*p2)(int) = ff//错误,没有任何一个ff能匹配的上

就是函数指针才不会去寻找匹配函数的最优解,有就有,没有拉倒。

函数指针形参

和数组类似,一个函数或许不能直接成为(另一个)函数的参数,但是函数是能够把函数的指针当作形参的。
例:

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 &));
//这跟上面的是等价的。

使用时可以直接传一个函数进来,作为实参,它会自动转成指针
useBigger(s1, s2, lengthCompare);
(用decltype, typedef能减少一些重复写长语句的麻烦)

返回指向函数的指针

和数组类似,虽然不能返回一个函数,但是能返回一个指向函数的指针. 用它的最好方法就是使用类型别名。

using F =int (int , int); 
using PF =int (*) (int *, int);

PF f1(int)//正确,PF是指向函数的指针,f1返回指向函数的指针
F f2(int) //错误,F是函数类型,f2不能返回一个函数
F *f3(int) //ok

当然也可以特别恶心的这样定义:

int (*f4(int)) (int ,int);

按照由内而外的顺序理解, 因为f4有形参列表,所以f4是个函数,f4前面有个*,所以f4返回的是一个指针,而因为指针类型本身也有形参列表,因此就是,返回一个指针,该指针指向一个函数,该函数有两个实参且返回一个int类型。

也可以使用尾置返回类型的方式
auto f5(int) -> int(*)(int *, int);

因为有了函数指针这种骚东西,意味着我们可以进行类似于将函数(指针)放进一个vector里作为一个函数数组的然后进行各种骚操作。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注