最近在研究STL的函数适配器时,才发现本身对函数指针其实也不太熟悉,因此决定写下这篇文章记录一下,以便未来又忘了的时候能够看看,说不定有人会所以而受益(虽然我也知道好象不太可能有人来看个人Blog)。
如下是最基本的函数指针的用法(指向外部函数):
#include
using namespace std;
void fun1();
void fun2();
int main()
{
void (*pF)();
pF = &fun1;
(*pF)();
pF = &fun2;
(*pF)();
system ("pause");
return 0;
}
void fun1()
{
cout << "fun1" << endl;
}
void fun2()
{
cout << "fun2" << endl;
}
虽说上面一段代码中的(*pF)()用pF()代替在大部分编译器上(至少我没遇到过不能经过编译的编译器)能够经过编译运行得很好而且看上去优雅多了,可是请记住(*pF)()才是真正符合标准的调用方法。BTW若是你以为void (*pF)();难看得很能够这样写将它替换成typedef void (* Fun)(); Fun pF;
好了,接下来咱们去看看指向类成员函数的函数指针:
#include
using namespace std;
class Test
{
public:
void fun1()
{
cout << "fun1" << endl;
}
void fun2()
{
cout << "fun2" << endl;
}
};
int main()
{
Test t;
typedef void (Test::*mem_fun)();
mem_fun pF;
pF = &Test::fun1;
(t.*pF)();
pF = &Test::fun2;
(t.*pF)();
system ("pause");
return 0;
}
OK,上面的代码工做得很好。指向普通函数(外部函数)的函数指针说过了,指向类成员函数的函数指针也说过了,这文章应该结束了吧?很不幸,还有一些东西还没说。首先,要说的是指向类的静态成员函数的函数指针应该是指向普通函数(外部函数)的函数指针。而后就是指向const成员函数的函数指针必须加上const,即应该这样定义该类型:typedef void (ClassName::*mem_fun)() const。顺便说一下指向虚函数的函数指针同样能够工做得很好。
好了,立刻就要结束了,在此以前我还有句话要说:C++比C多的不仅是指向类成员函数的函数指针,还有函数引用:)不过函数引用是不能用在类成员函数里面的(静态成员函数除外)。函数