函数指针的应用(2007-06-27)

来源:互联网 发布:当当阅读器知乎 编辑:程序博客网 时间:2024/05/01 23:33

2007-06-27
函数指针的应用
一、全局或静态函数指针
全局或静态函数指针非常简单,也是最为常见的只要函数实体为全局或静态函数就OK
1、函数指针定义
直接定义
typedef void ( *Function)(char* pStr);

Function  m_Function; 
2、函数指针负值
直接负值
m_Function  = test2;
3、函数指针变量的调用
直接负值
m_Function("调用类中静态函数成功!");
二、类中的函数指针
1、函数指针定义
由于在类中的非静态函数中都存在this指针,所以在定义类中使用的函数指针时要定义其所在类名:
typedef void ( CFunction::*Fun)(char* lp_t);
在原指针函数前加上所在类标志"CFunction::",否则将不认为是类中的指针;
在定义函数指针时只需要使用其指针名即可,不需要指定所属类:
ClassFun  m_ClassFun[2];

2、类中的函数指针负值
在vc7.1及以下版本中,于由编译器对编码要求不是很严禁,所以在一般的"类中的函数指针"负值时直接给值即可:
m_ClassFun[0] = test0;
而在vc8版本中,编译器对编码要求比较严格,所以在"类中的函数指针"负值时必须给与制订完整的地址:
m_ClassFun[0] = &CFunction::test0;

3、类中的函数指针变量在类中的调用
由于在类中的非静态函数中都存在this指针,所以在调用类中使用的函数指针时要表现出this指针:
(this->*m_ClassFun[0])("调用类中函数成功!");


/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/
/*代码段*/ 
/*全局函数指针定义*/ 
typedef 
void ( *Function)(char* pStr);

/*测试类*/ 
class CFunction
{
public:
 
/*类中函数指针定义*/ 
 typedef 
void ( CFunction::*ClassFun)(char* pStr);

public:
 ClassFun  m_ClassFun[
2]; /*类中指针函数*/ 

 Function  m_Function;  
/*全局或静态指针函数*/ 

public:
 CFunction();
 
~CFunction(){}

 
void ClassTest();
 
void Test();

 
void test0(char* pStr)
 {
  printf(
"函数[test0(char* pStr)]->[%s] ",pStr);
 }

 
void test1(char* pStr)
 {
  printf(
"函数[test1(char* pStr)]->[%s] ",pStr);
 }

 
static void test2(char* pStr)
 {
  printf(
"函数[static test2(char* pStr)]->[%s] ",pStr);
 }
};
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/

CFunction::CFunction()
{
 m_ClassFun[
0= &CFunction::test0;
 m_ClassFun[
1= &CFunction::test1;

 m_Function  
= test2;
}

void CFunction::ClassTest()
{
 (
this->*m_ClassFun[0])("调用类中函数成功!");
}

void CFunction::Test()
{
 m_Function(
"调用类中静态函数成功!");
}
/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/

int main()
{
 CFunction Function;
 
/*执行类中函数指针指向函数*/ 
 Function.ClassTest();

 
/*执行全局或静态函数指针指向函数*/ 
 Function.Test();

 
while(1);
 
return 0;
}