bool(*pf)(const string &, const string &);
*pf两侧的圆括号是必须的:
//declares a function named pf that returns abool*
bool *pf(const string &, const string &);
1.用 typedef简化函数指针的定义
使用 typedef为指针类型定义同义词,可将函数指针的使用大大简化。
typedef bool (*cmpFcn)(const string &, const string&);
表明 cmpFcn 是一种指向函数的指针类型的名字。该指针类型为"指向返回 bool 类型并带有两个const string 引用形参的函数的指针"
。
2.指向函数的指针的初始化和赋值
可直接使用函数名对指针做初始化或赋值(此时,直接引用函数名等效于在函数名上应用取地址操作符):
cmpFcn pf1 = lenthCompare;
cmpFcn pf2 = &lenthCompare;
//等效的
函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值
3.通过指针调用函数
指向函数的指针可用于调用它所指向的函数。可以不需要使用解引用操作符,直接通过指针调用函数:
cmpFcn pf = lenthCompare;
lenthCompare("hi", "bye");
//direct call
pf("hi","bye");
//equivalent call: pf1 implicitlydereferenced(隐式解引用)
(*pf)("hi","bye");
//equivalent call: pf1 explicitlydereferenced(显式解引用)
如果指向函数的指针没有初始化,或者具有0值,则该指针不能再函数调用中使用。只有当指针已经初始化,或被赋值为指向某个函数,方能安全地用来调用函数。
4.函数指针形参
5.返回指向函数的指针
函数可以返回指向函数的指针,如:
int (*ff(int))(int *, int);
函数不能返回函数,如:
int (ff(int))(int*, int);
允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针(或其他),但不能是函数
凡有函数类型的形参所对应的实参将被自动转换为指向相应函数类型的指针。但是,当返回的是函数时,同样的转换操作则无法实现。
typedef int func(int *, int );
voidf1(func);
//ok: f1 has a parameter of functiontype
funcf2(int);
//error: f2 has a return type of funciontype
func*f3(int);
//ok: f3 returns a pointer to functiontype
6.指向重载函数的指针
指针的类型必须与重载函数的一个版本精确匹配。如果没有精确匹配的函数,则对该指针的初始化或赋值都将导致编译错误。
*pf两侧的圆括号是必须的:
//declares a function named pf that returns abool*
bool *pf(const string &, const string &);
1.用 typedef简化函数指针的定义
使用 typedef为指针类型定义同义词,可将函数指针的使用大大简化。
typedef bool (*cmpFcn)(const string &, const string&);
表明 cmpFcn 是一种指向函数的指针类型的名字。该指针类型为"指向返回 bool 类型并带有两个const
2.指向函数的指针的初始化和赋值
可直接使用函数名对指针做初始化或赋值(此时,直接引用函数名等效于在函数名上应用取地址操作符):
cmpFcn pf1 = lenthCompare;
cmpFcn pf2 = &lenthCompare;
函数指针只能通过同类型的函数或函数指针或0值常量表达式进行初始化或赋值
3.通过指针调用函数
指向函数的指针可用于调用它所指向的函数。可以不需要使用解引用操作符,直接通过指针调用函数:
cmpFcn pf = lenthCompare;
lenthCompare("hi", "bye");
pf("hi","bye");
(*pf)("hi","bye");
如果指向函数的指针没有初始化,或者具有0值,则该指针不能再函数调用中使用。只有当指针已经初始化,或被赋值为指向某个函数,方能安全地用来调用函数。
4.函数指针形参
string s(const string s, const int i)
{
string sval;
if(i == 1) sval = s;
else sval = s + "s";
cout << sval << endl;
return sval;
}
void ff(string hh(const string, const int), const int i, const string sval)
{ hh(sval, i); }
int main()
{
ff(s, 2, "fuck");
}
5.返回指向函数的指针
函数可以返回指向函数的指针,如:
int (*ff(int))(int *, int);
函数不能返回函数,如:
int (ff(int))(int*, int);
允许将形参定义为函数类型,但函数的返回类型则必须是指向函数的指针(或其他),但不能是函数
凡有函数类型的形参所对应的实参将被自动转换为指向相应函数类型的指针。但是,当返回的是函数时,同样的转换操作则无法实现。
typedef int func(int *, int );
voidf1(func);
funcf2(int);
func*f3(int);
6.指向重载函数的指针
指针的类型必须与重载函数的一个版本精确匹配。如果没有精确匹配的函数,则对该指针的初始化或赋值都将导致编译错误。