C++函数指针

函数指针

函数指针指向的是函数而不是对象,函数指针也有类型,他的类型就是函数的返回类型、参数类型和个数。

bool func(const string&, const string&);
// 这个函数的类型就是
bool(const string&, const string&)
// 知道函数指针的类型后就可以声明函数指针了
bool (*pf) (const string&, const string&);
// 从上面的定义可以看出:使用一个指针代替函数名就声明完成了,其中bool是函数指针返回的类型,后面两个是参数,中间的(*pf)的括号必须要加上,不然会识别成返回bool指针的函数。因此pf是指针,它指向初始化的函数。
// 初始化函数指针
pf = func;
pf = &func;	// 要是使用lambda创建func时,不能用这种

// 使用函数指针
bool b1 = pf("hello", "goobye");
bool b2 = (*pf) ("hello", "goobye");
bool b3 = func("heool", "goobye");

// 重载函数指针
bool func(const string&, const string&);
bool (*pf) (const string&, const string&);
bool (*pf2) (const string&);
bool (*pf3) (const int&, const int&);
pf = func;
//pf2 = func;  	// 错误,函数指针参数个数不匹配,pf2只有一个参数,函数指针类型和函数类型不匹配
//pf3 = func;	// 错误,函数指针参数类型不匹配

// 函数指针作为形参,函数类型不能定义为函数的形参,但是函数指针可以作为函数的形参
// bool pf3(const string&, const string&)等价于bool (*pf4)(const string&, const string&),这里会隐式的进行类型转换,将函数类型转换为函数指针
void func2(const string&, const string&, bool pf3(const string&, const string&));
void func3(const string&, const string&, bool (*pf4)(const string&, const string&));
// 调用时可以直接将函数传进去,或者将函数指针传进去都行
func2("abc", "abc", func);
func2("abc", "abc", pf);

// 将函数指针作为返回类型
// F是函数类型
using F = int(int*, int);
// PF是函数指针类型
using PF = int(*) (int*, int);
// 下面两个都是函数的声明,其中f1是函数名称,F*/PF是返回类型,int是形参,是完成的函数声明
// 返回类型是PF(int(*) (int*, int)),是函数指针 类型
PF f1(int);
// 错误,F是函数类型,不能作为返回值
// F f2(int);
// 正确,F是函数类型,F*是函数类型的指针,也就是函数指针
F* f3(int);
// 当然也可以直接定义,不用F和PF
// 下面这个书上是怎么说的(我也有点没吃透,自己可能说不明白):按周由内而外的顺序阅读这条
// 语句:我们可以看到f1有形参列表,所以f1是个函数;f1前面有*,所以f1返回一个指针:进一步观
// 察发现,指针的类型本身也包含形参列表,因此指针指向函数,该函数的返回类型是int。
int (*f1(int)) (int*, int);
// 最后还可以用尾置返回类型的方式返回函数指针的函数
auto f1(int) -> int (*) (int*, int);	// 后面还可以添加lambda函数的定义。

// 最后就是auto和decltype两个常用的关键字
// auto和decltype的区别:主要是auto主要用于推算表达式的类型,而decltype可以堆单个目标进行类型推算,在不能
// 使用表达式时有着巨大作用,比如推算一个对象的类型时,decltype(item)就行,而此时auto是不能用的
// decltype在函数指针中还可以作用于单个函数,目的简化书写函数指针返回类型的过程,也就是说,decltype可以用来
// 返回函数的类型,但是如果要用函数指针就必须在decltype(function)后加上*,表示函数类型的指针,也就是函数指针
int func4(int*, int);
// 第一个是函数类型,第二个是函数指针
// decltype(func4) 结果为 int (int*, int)
// decltype(func4)* 结果为 int (*) (int*, int)

内容主要来自C++Primer的248页的函数指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值