需要注意:
1)函数指针所指向的函数,必须为全局函数或类的静态函数。
代码:
#include "stdafx.h"
#include <iostream>
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
class A
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
typedef int (*fun)(void);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
public:
void Test(fun fun1)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
(*fun1)();
};
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
static int add(void)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
std::cout<<"A::add()"<<std::endl;
return 2;
}
};
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int add2(void)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
std::cout<<"add2()"<<std::endl;
return 2;
}
static int add3(void)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
std::cout<<"add3()"<<std::endl;
return 3;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int _tmain(int argc, _TCHAR* argv[])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
A a;
a.Test(A::add);
a.Test(add2);
a.Test(add3);
return 0;
}
//output
//A::add()
//add2()
//add3()
//Press any key to continue . . .
成员函数指针:
#include "stdafx.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
class CMemFuncPtr;
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
typedef int (CMemFuncPtr::*MemFuncPtr)(int, int);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
class CMemFuncPtr
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public:
int Add(int iFirst, int iSecond)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
return iFirst + iSecond;
}
};
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int _tmain(int argc, _TCHAR* argv[])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
MemFuncPtr pfnMemFunc = &CMemFuncPtr::Add;
CMemFuncPtr test;
(test.*pfnMemFunc)(1, 3);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return 0;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
other samples:
#include "stdafx.h"
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
class Object;
typedef int (Object::*MemFuncPtr)(int, int);
typedef int (*StaticMemFuncPtr)(int, int);
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
class Object
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
public:
// non-static member
int Add(int iFirst, int iSecond)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
return iFirst + iSecond;
}
// static member
static int Sub(int iFirst, int iSecond)
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif)
{
return iFirst - iSecond;
}
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//
typedef int (Object::*InClassMemFuncPtr)(int, int);
typedef int (*InClassStaticMemFuncPtr)(int, int);
};
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
int _tmain(int argc, _TCHAR* argv[])
![](http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif)
{
// Test non-static Add
//
MemFuncPtr pfnMemFunc = &Object::Add;
// Need to bind the member function to a instance (need a this pointer)
Object test;
int res = (test.*pfnMemFunc)(1, 3);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// function call missing argument list; use '&Object::Add' to create a pointer to member
//MemFuncPtr pfnMemFunc1 = test.Add;
//res = (test.*pfnMemFunc1)(1, 3);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Object::InClassMemFuncPtr pfnMemFunc2 = &Object::Add;
res = (test.*pfnMemFunc2)(1, 3);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// Test Static Sub
//
// cannot convert from 'int (__cdecl *)(int,int)' to 'MemFuncPtr'
// Object::Sub Calling convention is __cdecl, but Object::*MemFuncPtr should be thisCall
// function signature include calling convention, parameter list and return value..
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
//pfnMemFunc = Object::Sub;
//res = (test.*pfnMemFunc)(1, 3);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
StaticMemFuncPtr pfnStaticMemFunc = Object::Sub;
res = (*pfnStaticMemFunc)(1, 3);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
StaticMemFuncPtr pfnStaticMemFunc1 = &Object::Sub;
res = (*pfnStaticMemFunc1)(1, 3);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
Object::InClassStaticMemFuncPtr pfnStaticMemFunc2 = &Object::Sub;
res = (*pfnStaticMemFunc2)(1, 3);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
// stl ? how to use this “function pointer”???
//std::mem_fun<int, Object>(&Object::Add);
//std::mem_fun<int, Object>(&Object::Sub);
![](http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif)
return 0;
}
![](http://www.cppblog.com/Images/OutliningIndicators/None.gif)
总结:
1)一般的全局的函数指针,只可以使用静态,全局的函数。
2)类的成员函数指针,可以使用类的成员函数。可以使用类的public成员函数指针。