注意点:函数指针作为实参和形参,auto,deltype与函数指针;函数类型与函数指针类型的不同,主要是能否作为返回值方面,以及decltype()返回的是函数类型,需要*显示的指出函数指针类型;
首先:不同类型的函数指针之间不能转换,不能进行不同类型的函数指针的赋值,
2.函数名取不取地址都是一样的:
bool lengthCompare(const 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=lenghtCompare("hello","goodbye");
这三个是等价的;也就是说对于函数指针来说,解引用和取地址符都不是必要的;
重载函数指针时,函数指针的类型必须与赋值的函数类型精确匹配,unsigned int与int也是有差别的,是不能赋值的;
函数指针形参
函数指针可以作为形参来使用,具体的函数可以作为实参来传值;
函数类型与函数指针类型在作为形参时都是正确的,但作为返回值时,函数只能返回指针类型,不能返回函数类型,因此需要显示的指出返回指针类型,
void useBigger(const string &,const string&,
bool pf(const string&,const string&));
void useBigger(const string &,const string&,
bool (*pf)(const string&,const string&));
第三个函数参数的声明很繁琐,我们使用typedef以及decltype简化它;
typedef bool Func(const string &,const string&);
typedef decltype(lengthCompare) Func2;
Func,Func2都是函数类型;
typedef bool (*Funp)(const string&,const string&);
typedef decltype(lengthCompare) *Funp2;
Funp,Funp2都是指向函数的指针,这里的区别可能就是指针可以被赋值,Func则不可以;
使用auto和using可以避免精确匹配带来的问题:
using PF=int (*)(int*,int);PF是指针类型;注意这只是声明了PF的类型
using F=int (int*,int);F是函数类型;
注意在返回值中,函数类型不会自动转换为指针类型,但在实参对形参的赋值中却是可以的;那么如果想要返回函数指针,就必须采用函数指针类型:
PF f1(int);
F f1(int);错误,函数不能返回函数,但可以返回一个指向函数的指针;
F* f1(int);正确,显示的指出了返回一个指针;
auto,decltype与函数指针类型:
decltype(lenghtCompare)返回的是函数类型,需要加上*表明他是一个函数指针类型
decltype(lengthCompare) *getFcn(const string&,const string&);
auto的使用要注意尾制返回类型:f1是实参为int,返回值是函数指针的函数类型指针;auto也可以使用赋值符进行定义;
auto f1(int)->int(*)(int*,int);
auto toNumber = [&](string const& s) -> unsigned {
...
}[]:定义匿名函数
[&]:以引用形式捕获所有外部变量,也就是外部变量均可用
(string const &s) :匿名函数的参数
->:定义匿名函数
unsigned:函数返回值类型
{...}:函数实现体
————————————————
版权声明:本文为CSDN博主「__KevinYzy__」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huluwaaaa/article/details/103225311