普通函數指針和指向成員函數指針

函數指針

最近在研究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多的不僅是指向類成員函數的函數指針,還有函數引用:)不過函數引用是不能用在類成員函數裏面的(靜態成員函數除外)。函數

相關文章
相關標籤/搜索