码迷,mamicode.com
首页 > 其他好文 > 详细

函数指针与虚函数表

时间:2016-01-24 23:54:02      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

函数指针

定义方式

typedef 返回值类型(* 新类型名称)(参数列表)

typedef char (*PTRFUN)(int); 
PTRFUN pFun; 
char glFun(int a){ return;} 
void main() 
{ 
    pFun = glFun; 
    (*pFun)(2); 
} 

调用方式:

  1. 直接把函数指针变量当作函数名,然后填入参数
  2. 将函数指针的反引用作为函数名,然后填入参数

上面的PTRFUN也可直接进行以下调用:

  PTRFUN(2); 

 

函数调用方式

函数名就是函数的地址,是一个编译时的常量,“函数连接”的本质就是把函数地址绑定到函数的调用语句上。

静态连接:一般的函数调用语句可以在编译的时候就完成这个绑定,这就是静态连接。

运行时连接&动态连接:

函数指针可以理解为一个新的类型,由其定义的变量,与其他变量一样,在编译期间是没有值的,因此函数指针与函数体的绑定关系只有到了运行时才确定。

对于函数指针数组,此特征表现的尤为明显,见《高质量程序设计指南》P135

class CTest
{
   public:
         void f(void){cout<<"CTest::f()"<<endl;} //普通成员函数
         static void g(void) {cout<<"CTest::g()"<<endl;} //静态成员函数
         virtual void h(void) {cout<<"CTest::h()"<<endl;} //虚拟成员函数

    private:
         //..........  
};

void main()
{
   typedef void (*GFPtr)(void);     //定义一个全局函数指针类型
   GFPtr fp = CTest::g;                 //取静态成员函数地址的方法和取一个全局函数的地址相似
   fp();                                         //通过函数指针调用类静态成员函数
   typedef void (CTest::*MemFuncPtr)(void)//声明类成员函数指针类型
   MemFuncPtr mfp_1 = &CTest::f;               //声明成员函数指针变量并初始化
   MemFuncPtr  mfp_2 = &CTest::h;             //注意获取成员函数地址的方法
   CTest theObj;
   (theObj.*mfp_1)();                //使用对象和成员函数指针调用成员函数
   (theObj.*mfp_2)();
   CTest* pTest = &theObj;
   (pTest->*mfp_1)();              //使用对象指针和成员函数指针调用成员函数
   (pTest->*mfp_2)();
}

  

函数指针与虚函数表

标签:

原文地址:http://www.cnblogs.com/zhehan54/p/5156190.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!