bool (*pf)(const string &, const string &);//这是函数指针
bool *pf(const string &, const string &);//去掉括号后,这是返回值为bool *类型的一个函数
1.typedef
typedef bool (*cmpFcn)(const string&, const string &);
2.初始化(bool lengthCompare(const string &, const string &))
cmmFun pf1 = 0;//可以初始化为0
cmmFun pf1 = lengthCompare;//可以初始化为指向某个类型相符的函数,如果类型不符,则产生错误
cmmFun pf1 = &lengthCompare;//取地址也可以。和上面的那个等价
3.调用
pf("hi", "bye");
(*pf)("hi", "bye");//这两种是等价的
4.函数指针形参
void useBigger(const string&, const srin &, bool(const string&, const string &) );
void useBigger(const string&, const srin &, bool(*)(const string&, const string &) );
//以上两个等价第三个参数是函数形式,并且自动的认为是一个指向函数的指针。
//the third parameter is a function type and is automatically treated as a pointer to function.
5.返回指向函数的指针
int (*fun(int ))(int *, int);
返回的是指向 int (*)(int *, int)类型的函数。可以typedef int (*pf)(int *, int),然后 pf fun(int),这个和上面的是等价的。其中的typedef 可以这样理解 type int (*)(int *, int) pf;
允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针,而不能是函数。
6.指向重载函数的指针
指针的类型必须与重载函数的一个版本精确匹配。如果没有精确匹配的函数,则对该函数指针的初始化赋值都将产生编译错误。精确匹配的意思是一点异样都不能有,必须完全一直,包括形参类型,函数名返回类型。如:
extern void ff(vector );
extern void ff(unsigned int);
void (*pf)(unsigned int) = ff;//match void ff(unsigned int)
void (*pf2)(int) = ff;//error!没有精确匹配的版本
内联(inline)函数,建议编译器在调用点直接把函数展开。以减小系统开销。但是也仅仅是建议,如果代码太大的话也不会展开。不过如果大的话,最好就不要用内联函数了。
阅读(2103) | 评论(0) | 转发(0) |