首页 > 其他分享 >类成员函数指针

类成员函数指针

时间:2022-11-27 18:56:20浏览次数:54  
标签:函数 void pmf 函数指针 成员 指针

类成员函数指针

 播报编辑讨论上传视频
向函数的指针变量 本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。 函数指针是指向函数的指针变量。函数指针可以像一般函数一样,用于调用函数、传递参数。函数指针只能指向具有特定特征的函数。因而所有被同一指针运用的函数必须具有相同的参数和返回类型。类成员函数指针(member function pointer),是C++语言的一类指针数据类型,用于存储一个指定类具有给定的形参列表与返回值类型的成员函数的访问信息。    
中文名
类成员函数指针
外文名
member function pointer
学    科
编程语言
定    义
一类指针数据类型
有关术语
函数指针
用    途
将数据与相关代码结合

目录

  1. 定义
  2. 语法
  3. 语义

定义

编辑 播报 类成员函数指针是一类指针数据类型,C++的语法之一,主要用途是把数据与相关代码结合在一起。这与委托(delegate)、函子(functor)、闭包(closure)等概念很像。虽然C++对此支持的并不太好。MFC类体系中,Windows消息传递处理机制是基于CCmdTarget类及其派生类的静态数据成员与静态成员函数GetThisMessageMap()。用户所写的类中的Windows消息处理函数(例如OnCommand)必须转换为CCmdTarget::*的成员函数指针类型AFX_PMSG,保存在该用户类的_messageEntries静态数组中。
1 typedef void (CCmdTarget::*AFX_PMSG)(void);
调用用户类中该消息处理函数时,根据该函数保存在_messageEntries中的signature(一个无符号整型表示的函数的形参类型列表与返回值类型),把类型为void (CCmdTarget::*AFX_PMSG)(void)的成员函数指针强制转为其它类型的CCmdTarget成员函数指针(例如void (AFX_MSG_CALL CWnd::*pfn_v_i_i)(int, int),在union MessageMapFunctions中列出了近百种CCmdTarget成员函数指针),然后调用转换后的成员函数指针。这是基于Visual C++编译器把单继承的成员函数指针编译为只保存了函数的内存起始地址,因此可以在同一个单继承类中把一种类型的成员函数指针强制转换为另一种成员函数指针,或者把单继承派生类的成员函数指针强制转换为基类成员函数指针。这是打破了C++标准的违例办法。例如,对于CWnd::OnCommand函数,转换过程是:
1 BOOL (CWnd::*)(WPARAM, LPARAM lParam) => void (CWnd::*)() => void (CCmdTarget::*)()
函数指针不能直接调用类的成员函数,需采取间接的方法,原因是成员函数指针与一般函数指针有根本的不同,成员函数指针除包含地址信息外,同时携带其所属对象信息 [1]  。

语法

编辑 播报 使用::*声明一个成员指针类型,或者定义一个成员指针变量。使用.*或者->*调用类成员函数指针所指向的函数,这时必须绑定(binding)于成员指针所属类的一个实例的地址。例如:
1 2 3 4 5 6 7 8 9 10 11 struct X {   void f(int){ };   int a; }; void (X::* pmf)(int); //一个类成员函数指针变量pmf的定义 pmf = &X::f;            //类成员函数指针变量pmf被赋值    X ins, *p; p=&ins; (ins.*pmf)(101);       //对实例ins,调用成员函数指针变量pmf所指的函数 (p->*pmf)(102);      //对p所指的实例,调用成员函数指针变量pmf所指的函数
由于C++运算符优先级列表中,函数调用运算符()的优先级高于.*与->*,因此成员函数指针所指的函数被调用时,必须把实例对象或实例指针、.*或->*运算符、成员函数指针用括号括起来,如上例所示。 C++标准规定,非静态成员函数不是左值,因此非静态成员函数不存在表达式中从函数左值到指针右值的隐式转换,非静态成员函数指针必须通过&运算符显式获得。所以上例中,pmf = X::f; 将编译报错。

标签:函数,void,pmf,函数指针,成员,指针
From: https://www.cnblogs.com/zxdplay/p/16930321.html

相关文章

  • 函数指针常用算法
    #include<stdio.h>voidfunc_int(void*a){printf("%d\n",*(int*)a);//输出int类型,注意void*转化为int}voidfunc_double(void*b){printf("%.2f\n",*(do......
  • 10-多态中调用成员的特点
    多态调用成员的特点解释理解多态调用成员的内存图......
  • [第二篇]object c中的self 和点语法 与成员变量声明规范
    ios支持​​.​​设置语法,但是含义是调用的方法,但是对于java而言这明明叫成员变量直接赋值.​​person.age=10​​​实际上调用的是​​[xxxsetAge:10]​​​​self.a......
  • 继承当中成员变量和成员方法的特点
    继承中:成员变量的访问特点小结成员方法的访问特点方法的重写代码实现方法重写的本质方法重写注意事项和要求练习思路总结......
  • 函数指针数组
    /* Function:函数指针数组*/#include<stdio.h>#include<stdlib.h>intfunc1(intn){printf("func1:%d\n",n);returnn;}intfunc2(intn){......
  • 调用函数指针
    /* DesignModel:设计模式 Function:使用函数指针列表搭建程序框架*/#include<stdio.h>#include<stdlib.h>inthello(inti);voidhey(inti);intsomeother(vo......
  • Stream的成员方法
    这里分为两类去说明:中间方法(4个)和结尾方法(2个)。1limit  2,skip  3,contact把两个流合并成一个流。调用的是静态方法。 4,distinct去除重复的元素。  ......
  • 函数指针
     1#include<cstdio>2#include<iostream>3usingnamespacestd;4intmax(intx,inty)5{6returnx>y?x:y;7}8intmain()9{10int......
  • 41:元组_元素访问_计数方法_切片操作_成员资格判断_zip()
    ###元组的元素访问和计数1.元组的元素不能修改>>>a=(20,10,30,9,8)>>>a[3]=33Traceback(mostrecentcalllast):File"<pyshell#313>",line1,in<module>a......
  • 36:列表_元素的访问_元素出现次数统计_成员资格判断
    ###列表元素访问和计数###通过索引直接访问元素我们可以通过索引直接访问元素。索引的区间在[0,列表长度-1]这个范围。超过这个范围则会抛出异常。>>>a=[10,20,30,4......