函数指针
函数指针指向的是函数而不是对象
函数指针指向的是函数而不是对象
函数的类型是由返回值和参数决定的,函数名并不是函数类型的一部分(不管函数名怎么起,不影响函数类型)
bool lengthCompare(const string &, const string &);
//其类型是:bool(const string&, const string&)
//嗯,这样理解函数指针就方便多了,我们只是定义了一个指针取代了函数的名字而已
bool (*pf)(const string &, const string &);
但若声明为:bool *pf(const string &, const string &);则是返回值为bool *,函数名为pf的函数,所以用括号先保证了指针(*pf)的存在
在使用函数名的时候,函数名其实已经转换为指针了。所以这个赋值没有问题:
pf = lengthCompare;//pf指向了名字为lengthCompare的函数。上面已经定义了pf为指针,lengthCompare是函数名
bool b1 = pf("hello", "goodbye"); //调用lengthCompare函数
bool b2 = (*pf)("hello", "goodbye"); //作用同上
bool b3 = lengthCompare("hello", "goodbye"); //作用同上
//直接拿上面的定义和新定义的函数举例
string::size_type sumLength(const string&, const string&);
bool cstringCompare(const char*, const char*);
pf = 0; //可以,pf没有指向任何函数
pf = sumLength; //错误,返回值类型不同
pf = cstringCompare; //错误,参数类型不同
pf = lengthCompare; //可以,返回值和参数类型都相同
/*这个例子进一步理解函数的类型:返回值和参数*/
同数组一样,不能直接返回数组,但是可以返回数组指针;同理,不能返回函数类型,只能返回函数指针
同数组作参数会被转换为数组指针一样,也没有函数类型的参数,写做参数时,自动转换为函数指针
//第三个参数转换为函数指针
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);