普通函数指针和指向成员函数指针

荒凉一梦 提交于 2019-12-06 03:23:23

函数指针

最近在研究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多的不只是指向类成员函数的函数指针,还有函数引用:)不过函数引用是不能用在类成员函数里面的(静态成员函数除外)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!