You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中星号(*)及this->*语法的含义是什么?

关于C++成员函数指针的疑问解答

我来给你拆解这段代码里的两个关键点,都是C++里有点绕的成员函数指针相关语法,看完你就懂了:

一、先理解MyClass.h里的成员变量类型

先看你贴的这段定义:

std::vector<Status_e(MyClass::*)(TupleInfo & info)> m_processObjects;

这里的Status_e(MyClass::*)(TupleInfo & info)是一个成员函数指针类型,拆开来解释每个部分:

  • Status_e:这个指针指向的成员函数的返回值类型(就是你提到的那个枚举)
  • MyClass::*:这是核心标记——说明这是属于MyClass类的成员函数指针(和普通函数指针不同,成员函数是和类绑定的,必须明确它属于哪个类)
  • (TupleInfo & info):这个成员函数的参数列表(接受一个TupleInfo结构体的引用)

所以整个m_processObjects就是一个容器,专门存储MyClass类里那些“接受TupleInfo&参数、返回Status_e”的成员函数的指针。

二、再搞懂this->*的用法

然后看cxx文件里的调用代码:

status = (this->*m_processObjects[f])( m_tuples[i] );

这里的this->*是C++里专门用来调用成员函数指针的语法,原因很简单:非静态成员函数必须依附于类的对象才能执行(每个非静态成员函数都隐含一个this指针参数),所以不能像普通函数指针那样直接(*func)()调用。

拆解这句代码的逻辑:

  1. m_processObjects[f]是从vector里取出的一个成员函数指针,它指向MyClass的某个符合签名的成员函数
  2. this是当前MyClass对象的指针,->*的作用就是把这个对象指针和成员函数指针绑定起来
  3. 最后加上参数列表(m_tuples[i]),就可以执行这个成员函数,把返回值赋值给status

补充个小细节:这里的括号(this->*m_processObjects[f])必须加,因为函数调用的优先级比->*高,如果不加括号,编译器会先尝试调用m_processObjects[f](m_tuples[i]),这显然不对,因为它是个指针不是函数。如果是用对象(不是指针),语法就是(obj.*func)(info),原理是一样的。

内容的提问来源于stack exchange,提问作者spring cc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:14:15