函数指针的作用:
一是用来做为一种泛型算法的比较策略。最常见的就是排序算法,由于你不能事先知
道被排序对象的类型,就不能简单地用’<’或者’>’来判断其大小,这时就需要调用者
在调用时指定比较标准,在C语言中,这就是通过函数指针来实现的。看C的标准库函数qs
ort:
void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(cons
t void *elem1, const void *elem2 ) );
最后一个参数compare就是用来指定如何比较elem1和elem2的大小。但是在C++中,由于
引入了类,这时的比较标准就不再仅仅由函数指针来指定了,还可以用一个类的对象。再
看
C++标准库中的sort:
template<class RanIt, class Pred>
void sort(RanIt first, RanIt last, Pred pr);
最后一个参数Pred指定了比较的标准。它可以是一个函数指针,也可以是一个类,这个类
需要提供一个operator( )操作:
class compare{
public:
int operator()(const some_type& t1,const some_type& t2)const
{ return t1>t2; } //or some other compare criteria
};
这样,compare pr; pr(t1,t2);就可以返回t1与t2的比较结果,其形式与pr是函数指针
时 一样的。但用类有一个明显的好处:operator()可以是内联函数,在比较过程就可以省
去很多函数调用的开销。
函数指针的第二种用途是作为输入/输出流的格式控件符。像我们经常用的cout<<x<<f
lush<<y<<flush;这里flush其实就是一个函数指针:
ostream& flush(ostream& s){ //这里只是说明一上大致如何实现,真正的版本是用
模
return s.flush(); //板来实现的
}
ostream类定义了operator<<来接受这个函数指针参数:
class ostream{
……………
public:
ostream& operator<<(ostream& (*f)(ostream&)) { return f(*this); }
};
函数指针的第三种用途涉及DLL。当你在运行期间用LoadLibrary动态加载一个DLL时,
需要用GetProcAddress来得到需要调用的函数的地址,这就是一个函数指针。
另外,在MFC中,每个类的消息处理函数都是以函数指针的形式保存在一个私有的_mes
ssageEntry数组中。在需要某个处理消息时,就遍历各个类的_messageEntry数组,看有没
有对应于这个消息的结点,如果有就取出对应的函数指针来调用消息处理函数。
一时只能想到这么多了,还是让我们等着看小李子的大作吧。