C++的靜態成員函數指針
?
先簡單的說說非靜態的成員函數。
非靜態成員函數指針的類型:
? ? 類的非靜態成員是和類的對象相關的。也就是說,要通過類的對象來訪問變量。
成員函數的類型定義為:
? ? typedef void (A::*pfunc)();
?A是一個類,有一個成員函數void test();
?使用:
? ? pfunc p = A::test;
?
示例:
[cpp]?view plain?copy
- #include?<iostream>??
- ??
- using?namespace?std;??
- ??
- class?A?{??
- ??
- public?:??
- ??void?test1()?{?cout?<<?"test"?<<?endl;?};??
- public?:??
- ??
- };??
- ??
- typedef?void?(A::*PFunc)();??
- ??
- int?main()?{??
- ??A?a;??
- ??PFunc?f?=?&(A::test1);??
- ??
- ??(a.*f)();??
- ??
- ??system("PAUSE");??
- ??return?0;??
- }??
?
?
?
需要注意的是因為成員函數地址的解引用必須要附駐與某個對象的地址,所以我們必須創建某個對象,來調用這個函數。
?
靜態成員函數,可以通過類作用域符來訪問。
靜態成員函數的類型:靜態成員函數的地址可用普通函數指針儲存,而普通成員函數地址需要用 類成員函數指針來儲存。
typedef void (*pfunc) ();
這個和普通函數的指針是一樣的。
使用的時候也可以像普通函數一樣。
?
示例:
[cpp]?view plain?copy
- #include?<iostream>??
- ??
- using?namespace?std;??
- ??
- class?A?{??
- ??
- public?:??
- ??static?void?test1()?{?printf("test\n");?};??
- public?:??
- ??
- };??
- ??
- typedef?void?(*PFunc)();??
- ??
- int?main()?{??
- ??PFunc?f?=?&(A::test1);??
- ??
- ??(*f)();??
- ??
- ??system("PAUSE");??
- ??return?0;??
- }??
另外:靜態成員的初始化不受訪問控制的限制。 ? ? ? ? ? ? ?
根據C++primer所說,要想確保對象只定義一次,最好的辦法就是把靜態數據成員的定義和其他非內聯函數的定義放在同一個文件中。