zoukankan      html  css  js  c++  java
  • C++中怎么获取类的成员函数的函数指针?

    用一个实际代码来说明。

    1. class A
    2. {
    3. public:
    4.     staticvoid staticmember(){cout<<"static"<<endl;}   //static member
    5.     void nonstatic(){cout<<"nonstatic"<<endl;}          //nonstatic member
    6.     virtualvoid virtualmember(){cout<<"virtual"<<endl;};//virtual member
    7. };
    8. int main()
    9. {
    10.     A a;
    11.     //static成员函数,取得的是该函数在内存中的实际地址,而且因为static成员是全局的,所以不能用A::限定符
    12.     void(*ptrstatic)()=&A::staticmember;      
    13.     //nonstatic成员函数 取得的是该函数在内存中的实际地址    
    14.     void(A::*ptrnonstatic)()=&A::nonstatic;
    15.     //虚函数取得的是虚函数表中的偏移值,这样可以保证能过指针调用时同样的多态效果
    16.     void(A::*ptrvirtual)()=&A::virtualmember;
    17.     //函数指针的使用方式
    18.     ptrstatic();
    19.     (a.*ptrnonstatic)();
    20.     (a.*ptrvirtual)();
    21. }

    可以参考《C++ Primer(3rd)》第532页13.6指向类成员的指针一节~

    1.一个指向外部函数的指针声明为:

    1. void(*pf)(char*,constchar*);
    2. void strcpy(char* dest,constchar* source);
    3. pf=strcpy;

    2.一个指向类A成员函数的指针声明为

    1. void(A::*pmf)(char*,constchar*);

    声明的解释是:pmf是一个指向A成员函数的指针,返回无类型值,函数带有二个参数,参数的类型分别是char * 和 const char *。除了在星号前增加A:: ,与声明外部函数指针的方法一样。

    3.给成员指针赋值的方法是将函数名通过指针符号&赋予指针名
    如下所示:

      1. class A
      2. {
      3.   public:
      4.    void strcpy(char*,constchar*);
      5.    void strcat(char*,constchar*);
      6. };
      7. pmf =&A::strcpy;
  • 相关阅读:
    两个栈实现一个队列,C语言实现,队列可伸缩,容纳任意数目的元素。
    创建双向链表的一个陷阱!!
    实现单链表的倒置
    《征服c指针》学习笔记-----统计文本单词数目的程序word_count
    [stm32]IAR环境 hardfault定位
    [FreeRTOS] 函数笔记
    [C语言]字符串函数大全
    [verilog]常用任务之模拟UART Rxd引脚输入数据
    [git] 知识点
    [FreeRTOS] 临界区处理
  • 原文地址:https://www.cnblogs.com/lidabo/p/3597559.html
Copyright © 2011-2022 走看看