C++成员函数指针的应用

Stata实战:DID平行趋势检验完整操作指南(附reghdfe+coefplot代码) 本文提供了一份使用Stata进行DID平行趋势检验的完整实战指南。文章详细讲解了从数据准备、生成相对时间变量,到利用reghdfe命令构建动态效应模型,以及使用coefplot命令进行结果可视化的全流程操作。核心在于通过检验政策前交互项的显著性,验证处理组与对照组是否满足平行趋势假设,为后续因果推断奠定可靠基础。 阅读详情
        C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。

  刚遇到这种语法时也许会让你止步不前。但你会发现,使用恰当的类型定义之后,复杂的语法是可以简化的。本文引导你了解成员函数指针的声明,赋值和调用回叫函数。

  成员函数指针的声明

  一个成员函数指针包括成员函数的返回类型,后随::操作符类名,指针名和函数的参数。初看上去,语法有点复杂。其实可以把它理解为一个指向原函数的指针,格式是:函数返回类型,类名,::操作符,指针星号,指针名,函数参数。

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

  void (*pf)(char *, const char *);

  void strcpy(char * dest, const char * source);

  pf=strcpy;

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

  void (A::*pmf)(char *, const char *);

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

  赋值

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

  class A

  {

  public:

   void strcpy(char *, const char *);

   void strcat(char *, const char *);

  };

  pmf = &A::strcpy;

  有些老的编译器可以通过没有&号的赋值方式,但标准C++强制要求加上&号。

  使用类型定义

  可以用类型定义来隐藏复杂的成员指针语法。例如,下面的语句定义了PMA是一个指向A成员函数的指针,函数返回无类型值,函数参数类型为char * 和 const char *:

  typedef void(A::*PMA)(char *, const char *);

  PMA pmf= &A::strcat; // pmf是PMF类型(类A成员指针)的变量

  下文会看到使用类型定义特别有利于声明成员指针数组。

  通过成员指针调用成员函数

  可以在不必知道函数名的情况下,通过成员指针调用对象的成员函数。例如,函数dispatcher有一个变量pmf,通过它调用类成员函数,不管它调用的是strcpy()函数还是strcat()函数。指向外部原函数的指针和指向类成员函数的指针是有很大区别的。后者必须指向被调函数的宿主对象。因此,除了要有成员指针外,还要有合法对象或对象指针。

  现举例做进一步说明。假设A有二个实例,成员函数指针支持多态性。这样在成员指针调用虚成员函数时是动态处理的(即所谓后联编 - 译注)。注意,不可调用构造和析构函数。示例如下:

  A a1, a2;

  A *p= &a1; //创建指向A的指针

  //创建指向成员的指针并初始化

  void (A::*pmf)(char *, const char *) = &A::strcpy;

  //要将成员函数绑定到pmf,必须定义呼叫的对象。

  //可以用*号引导:

  void dispatcher(A a, void (A::*pmf)(char *, const char *))

  {

   char str[4];

   (a.*pmf)(str, “abc”); //将成员函数绑定到pmf

  }

  //或用A的指针表达方式指向成员指针:

  void dispatcher(A * p, void (A::*pmf)(char *, const char *))

  {

   char str[4]; (p->*pmf)(str, “abc”);

  }

  //函数的调用方法为:

  dispatcher(a, pmf); // .* 方式

  dispatcher(&a, pmf); // ->* 方式
高级使用技巧

  以上是成员函数的基本知识。现在介绍它的高级使用技巧。

  成员指针数组

  在下例,声明了一个含有二个成员指针的数组,并分配类的成员函数地址给成员指针:

  PMA pmf[2]= {&A::strcpy, &A::strcat}; 
也就是
      void (A::*PMA[2])(char *, const char *)= {&A::strcpy, &A::strcat};

  这样的数组在菜单驱动应用中很有用。选择菜单项后,应用将调用相应的回叫函数,如下所示:

  enum MENU_OPTIONS { COPY, CONCAT };

  int main()

  {

   MENU_OPTIONS option; char str[4];

   //从外部资源读取选项

   switch (option)

   {

    case COPY:

     (pa->*pmf[COPY])(str, “abc”);

     break;

    case CONCAT:

     (pa->*pmf[CONCAT])(str, “abc”);

     break;

     //…

   }

  }

  Const 类型的成员函数

  成员指针的类型应该与成员函数类型一致。上面例子中的pmf 可以指向A的任意函数,只要该函数不是const类型。如下所示,如果将touppercase()的地址分配给pmf,将导致编译出错,因为touppercase() 的类型是const。

  Class A

  {

  public:

   void strpcy(char *, const char *);

   void strcat(char *, const char *);

   void touppercase(char *, const char*) const;

  };

  pmf=&A::touppercase; //出错,类型不匹配

  //解决的方法是声明一个const类型的成员指针:

  void (A::pcmf)(char *, const char *) const;

  pcmf=&A::touppercase; // 现在可以了

  有些差劲的编译器允许一个非const类型的成员指针指向const类型的成员函数。这在标准C++是不允许的。

  结语

  可能有点费解:成员指针不是真正的指针。传统意义上的指针是一个整数,保存指向某个变量或函数的地址。成员指针则是一个复合数据结构,包含有若干个数据成员。成员指针的这个复杂性使得入门比较困难。然而,一旦掌握了它的语法,就能感到它是在事件驱动和多线程应用中调用回叫函数必不可少的工具。
Open3D 计算点云的主曲率 本文介绍了点云主曲率计算的方法与实现。通过分析曲面局部几何形状的主曲率(最大和最小方向),基于法线构建投影矩阵和协方差矩阵,使用奇异值分解计算曲率。代码采用Open3D实现,包括点云加载、法线估计、邻域搜索和曲率映射可视化功能。系统支持交互式点云文件选择,将曲率值映射为色彩进行直观展示,为点云处理中的特征提取和分割任务提供基础几何特征。实现过程包含了法线去中心化、协方差矩阵构建和特征值归一化等关键步骤,完整展示了从理论到实践的曲率分析流程。 阅读详情

相关推荐

NVIDIA vGPU三种授权方式(个人玩家版)

NVIDIA vGPU三种方式搭建授权服务器(个人玩家版)

wstc2689784536的博客 8435

指向成员函数的函数指针

C语言中的函数指针还是很简单的,这里还是稍微总结一下: 函数地址: 函数名,&函数名,两者均可。 函数指针变量的定义方法: 把函数名替换为你喜欢的变量名,并在前面加*号,并把*号和函数名()起来。 函数指针类型的定义方法: 把上一步的变量名替换为你喜欢的类型名,前面再直接加typedef即可。 例子: (1) 函数定义如下: char *parseF...

野生猿-群号1025127672 1261

集成电路设计学习笔记(二)基于IC617反相器设计之原理图绘制

博主的博客网站 欢迎大家访问! ccbirds.cn ccbirds.github.io 本文主要记录在IC617中原理图的绘制和schematic的使用方法。 新建library 要画设计自己的集成电路,需要建一个自己的库,方便对自己设计文件的管理。 打开library manager,file 下NEW下Library 选择库的保存路径,一般默认即可,并在name中填入自己库的名字。...

ccbirds 7373

指向成员函数的指针和this指针

1.指向类的成员函数的指针 (1)定义的一般形式:数据类型 (类名:: * 指针变量名)(参数表列) (2)使成员函数指针指向类的共用成员函数的一般形式:函数指针名=&类名::函数名 (3)利用函数指针调用类的成员函数一般形式:(对象名 . 函数指针名)() #include using namespace std; class Time { public: Time(int h, in...

weixin_43597743的博客 2810

Cadence IC617仿真实践:有源电流镜的共模抑制比优化策略

本文基于Cadence IC617平台,详细介绍了有源电流镜共模抑制比(CMRR)的仿真与优化全流程。从电路搭建、DC工作点分析到AC仿真获取差模/共模增益,逐步解析CMRR计算方法。核心优化策略包括提升电流镜输出阻抗、优化差分对匹配性及调整晶体管尺寸,并探讨了与电源抑制比(PSRR)的权衡,为模拟集成电路设计提供实用指南。

weixin_29313817的博客 183

告别手动拖拽!PyQt5/PyQt6 QTableView列宽自适应窗口的三种实战方案(附性能对比)

本文详细介绍了PyQt5/PyQt6中QTableView列宽自适应窗口的三种实战方案,包括Stretch模式、resizeEvent手动计算和ResizeToContents模式,并附有性能对比。帮助开发者解决窗口大小变化时列宽不变的常见问题,提升用户体验和开发效率。

weixin_42538752的博客 232

C++指向类成员的函数指针

定义:类成员函数指针(member function pointer),是 C++ 语言的一类指针数据类型,用于存储一个指定类具有给定的形参列表与返回值类型的成员函数的访问信息。基本上要注意的有两点:1、函数指针赋值要使用 & 2、使用 .* (实例对象)或者 ->*(实例对象指针)调用类成员函数指针所指向的函数 下面看两个例子:对于 nonstatic member function (非静态成员函数)取地址,获得该函数在内存中的实际地址对于 virtual function(虚函数), 其地址在编译时期

weixin_43488671的博客 3892

Concentration Inequality(集中不等式)更新版

欢迎来我博客 https://wyue.name/2020/04/17/1/阅读这一篇博文 转载前请联系我,联系方式请见我博客 https://wyue.name/ Concentration inequality 刻画了一组随机变量的和(或者样本平均数)与其期望值的偏离程度,在算法收敛性分析过程中是非常有用的一类不等式。 这次主要总结一下最近一段时间遇到的集中不等式,不仅是不等式形式,...

Yue的博客 4554

大胆使用指向成员函数的指针

大胆使用指向成员函数的指针         指向成员函数的指针是C++中比较复杂的语法结构,然而,它却是事件驱动和多线程环境中不可缺少的,特别是当从外部调用成员函数的时候。在多线程里,每一个线程都通过指向成员函数的指针调用这一函数。如果C++没有这些语法特性,那么在很多情况下进行C++程序开发会遇到很多麻烦。        也许你开始会被这一性质的语法吓倒,但当你熟悉之后你就会觉得它相当方便,

Zaobird的专栏 4879

优快云余额充值前必读:这5个隐藏条款,90%的开发者都忽略了(附iOS内购避坑指南)

本文揭示了优快云余额充值中90%开发者忽略的5个隐藏条款,包括不可退款规则、iOS内购限制、账号安全责任等关键内容,特别提供了iOS内购避坑指南,帮助开发者避免资金损失和账号风险。

weixin_26765287的博客 147

ConvNeXt 改进 :ConvNeXt添加GnConv递归门控卷积,二次创新CNBlock结构 ,独家首发

视觉 Transformer 在多种任务中取得了显著的成功,这得益于基于点积自注意力的新空间建模机制。视觉 Transformer 中的关键因素——即输入自适应、长距离和高阶空间交互——也可以通过卷积框架高效实现。作者提出了递归门控卷积(Recursive Gated Convolution,简称 gnConv),通过门控卷积和递归设计执行高阶空间交互。该新操作具有高度的灵活性和可定制性,兼容各种卷积变体,并将自注意力中的二阶交互扩展到任意阶数,而不会引入显著的额外计算。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 234

4.4 指向成员函数的指针

Q1:非静态成员函数的地址• 非静态成员函数地址值:○ 如果该函数是非虚函数,则得到的结果是其在内存中真正的地址○ 如果该函数是虚函数,则得到的结果是其在虚函数表中的索引值• 地址不完全性(数据成员的地址与函数成员的地址): ○ 非静态数据成员的地址是其在类的布局中的位置(加1),是一个不完整的值,需要将其绑定在一个类对象上,才能进行存取○ 非静态函数成员(非虚)的地址是其在内存中的真正地址,但仍是

Virtual_Func的博客 810

零基础入门转录组数据可视化——绘制差异小提琴图(常规)

转录组数据可视化之一,先介绍相关基础知识,其次用实际案例为基础,由浅入深介绍差异小提琴图绘制的全过程,包括内容有相关代码和截屏。

呆猪儿的博客 635

C++中成员函数指针的应用

C++成员函数指针的应用 C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。   刚遇到这种语法时也许会让你止步不前。但你会发现,使用恰当的类型定义之后,复杂的语法是可以简化的。本文引导你了解成员函数指针的声明,赋值和调用回叫函数。

leaderYU的专栏 856

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C++成员函数指针与其应用场景

//成员函数指针 #include using namespace std; //全局函数 void test (){ cout << "this is test" << endl; } void test2 (int a){ cout << "this is test22222" << endl; } //结构体 struct Date{ int year;

iOS小菜鸟的专栏 1045

【转载】C++成员函数指针的应用,可作为回调函数实参

做个笔记,本文转自:http://www.cppblog.com/colys/articles/25785.html C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。    刚遇到这种语法时也许会让你止步不前。但你会发现

yangyihongyangjiying的专栏 461

C++成员函数指针的应用(学习收录)

感谢!http://blog.youkuaiyun.com/sharpdew/articles/694852.aspx C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。   刚遇到这种语法时也许会让你止步不前。但你会发现,使用恰当的类型定...

dongbang3606的博客 94

c++成员函数指针的应用

C++中,成员指针是最为复杂的语法结构。但在事件驱动和多线程应用中被广泛用于调用回叫函数。在多线程应用中,每个线程都通过指向成员函数的指针来调用该函数。在这样的应用中,如果不用成员指针,编程是非常困难的。    刚遇到这种语法时也许会让你止步不前。但你会发现,使用恰当的类型定义之后,复杂的语法是可以简化的。本文引导你了解成员函数指针的声明,赋值和调用回叫函数。    成员函数指针的声明

nizhannizhan的专栏 445

c++ 成员函数指针 赋给普通指针_C++指针的应用

C++指针文章中我们介绍了指针的基本概念和应用简介。我们有提到指针可以使用在链表、队列和二叉树,等等。但是这些都会比较复查,后面"数据结构” 时,我们会用专门的章节来讲解这些知识。这篇文章,详细的探讨一下指针和其他关联的具体应用。1. 指针和数组的关系在C语言中,指针与数组之间的关系十分密切。实际上,许多可以用数组完成的工作都可以使用指针来完成。一般来说,用指针编写的程序比用数组编写...

weixin_35892206的博客 742

【C++高级编程必修课】:成员函数指针调用的10种经典应用场景

掌握C++成员函数指针的调用技巧,解决多态与回调难题。涵盖事件处理、状态机、命令模式等10大应用场景,详解语法绑定与性能优化。提升代码灵活性与可维护性,值得收藏。

DebugLoom的博客 364
上一篇: 关于N皇后问题高效试探回溯算法的分析
下一篇: C++ virtual member function FAQ
sharpdew
博客等级 码龄23年 76粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值