C++类函数指针的使用(收藏)

在注册一个回调函数时候,我们常常使用函数指针.c++/c的连接器在连接程序的时候必须把函数的调用语句上,因此函数地址必须在编译时就确定下来.也就是编译器为函数生成代码的时候.

  typedef int(* FuncPtr)(const char*) 定义一个函数指针的类型

类 的成员函数有4种类型:inline,virtual,static,normal。inline函数在运行时会展开,虽然语言允许取其地址,但是没有太 大的意义.virtual成员函数的地址指的是其在vtable中的位置;static成员函数的地址和普通全局函数的地址没有任何区别;普通成员函数的 地址和一般函数的地址也没有区别,就是函数代码在内存中的真实地址,但是由于它的调用要绑定到一个实在实在在的对象身上,因此无论是其函数指针的声明方式 还是其地址的获取方式都比较特别.

代码如下:
#include <iostream.h>

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;
   }
};

int 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)();
  retun 0;
}

实 际上,任何成员函数的代码体都是独立于类的对象而存在的,只是非静态成员函数在调用的时候需要与具体的对象建立绑定关系而已(即this指 针),c++/c编译器最终把所有的成员函数经过Name-Mangling的处理后转换全局函数,并且增加一个入参this作为第一个参数,供所属类的 所有对象共享.因此成员函数的地址实际上就是这些全局函数的地址.

 

http://www.91linux.com/html/article/program/cpp/20100907/20440.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值