函数指针——CPP Primer 221

注意点:函数指针作为实参和形参,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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值