led灯外贸网站建设,58同城济南网站建设,excel+表格+做的网站,大宗商品平台函数指针
函数指针指向的是函数而不是对象。和其他指针一样#xff0c;函数指针指向某种特定的类型。函数的类型由他的返回类型和形参类型共同决定#xff0c;而与函数的名字无关。
//比较两个string对象的长度
bool lengthCompare(const string ,const string );…函数指针
函数指针指向的是函数而不是对象。和其他指针一样函数指针指向某种特定的类型。函数的类型由他的返回类型和形参类型共同决定而与函数的名字无关。
//比较两个string对象的长度
bool lengthCompare(const string ,const string );
要想声明一个可以指向该函数的指针只需要指针替换函数的名字即可pf的名字之前有一个* 因此pf是指针右侧是形参的列表表示pf指向的是函数观察左侧发现函数的返回数值是bool类型的。因此pf就是一个指向函数的指针其中该函数的参数是两个const string的引用返回的是bool类型。
//pf指向一个函数该函数的参数是两个const string的引用返回的数值是bool类型
bool (*pf)(const string ,const string );//未初始化
*pf两端的括号不可以省略如果没有这对括号则pf是一个返回数值为bool的指针的函数
//声明一个名为pf的函数该函数返回bool *
bool *pf(const string ,const string );//未初始化
使用函数指针
当把函数的名字作为一个数值进行使用的时候该函数会自动地转化成指针。
//例如按照如下的形式将lengthCompare的地址赋值给pf
//pf lengthCompare; //pf指向名字为lengthCompare的函数
//pf lengthCompare;//等价的赋值语句取地址符的符号是可选的还可以直接使用指向函数的指针调用该函数而不需要提前解引用指针
bool b1 pf(hello,goodbye); //调用lengthCompare函数
bool b2 (*pf)(hello,goodbye);//一个等价的调用
bool b3 lengthCompare(hello,goodbye);//一个等价的调用指向不同函数类型的指针之间不存在转换的规则但是我们可以为函数指针赋值一个nullptr或者数值为0的整型常量的表达式表示这个指针没有指向任何一个函数
重载函数的指针
当使用重载函数的时候上下文必须界定该选用哪个函数。如果定义了指向重载函数的指针
void ff(int *);
void ff(unsigned int);
void (*pf1)(unsigned int) ff;//pf1指向了ff(unsigned int)
函数的指针形参
和数组类似虽然不可以定义函数类型的形参但是形参可以是指向函数的指针。此时形参看起来是函数的类型实际上却是当成指针来使用//第三个形参是函数类型他会自动的转换成指针
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来简化使用函数指针的代码
//Func和Func2是函数的类型
typedef bool Func(const string ,const string );
typedef decltype(lengthCompare) Func2; //等价的类型
//Funcp和Funcp2是指向函数的指针
typedef bool (*Funcp)(const string ,const string );
typedef decltype(lengthCompare) *Funcp2; //等价的类型decltype返回函数的类型不会将函数的类型自动转化成为指针类型。因为decltype的类型是函数类型因此只有在前面加上*才可以得到指针。
//usingBigger的等价声明其中使用了类型的别名
void useBigger(const string s1,const string s2,Func);
void useBigger(const string s1,const string s2,Func);
这两个语句声明的是同一个函数在第一句中编译器自动的将Func表示的函数类型转化为指针
返回指向函数的指针
和数组类似不能返回一个函数但是可以返回一个指向函数的类型的指针。必须将返回的类型写成指针的形式编译器不会自动的将函数的返回类型当成对应的指针类型进行处理。要想声明一个返回函数指针的函数最简单的方法是使用类型别名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); //正确显示的指定返回的类型是指向函数的指针
也可以直接使用下面的形式直接声明f1 int(*f1(int))(int *,int);按照由内达外的形式阅读这条语句f1有形参列表所以f1是一个函数f1前面有*所以f1返回的是一个指针指针的类型本身也包含了形参的列表因此指针指向函数该函数的返回类型是int。还可以使用尾置返回的类型的方式来声明一个返回函数指针的函数 auto f1(int) - int (*)(int *,int);
将auto和decltype用于函数指针类型
如果明确知道返回的函数是哪一个就可以使用decltype简化书写函数指针返回类型的过程。假定有两个函数返回的类型都是string::size_type,并且各有两个const string类型的形参编写第三个函数接收一个string类型的参数返回一个指针这个指针指向前两个函数中的一个。string::size_type sumLength(const string ,const string );string::size_type largerLength(const string ,const string );//根据形参的取值编写的getFcn函数返回指向上面函数的其中一个decltype(sumLength) * getFcn(const string );
声明getFcn唯一需要注意的地方是牢记将decltype函数作用于某一个函数的时候返回的是函数的类型而不是指针类型。因此只有显示地加上 * 表示需要返回的是指针而不是函数的本身。