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)()调用。
拆解这句代码的逻辑:
m_processObjects[f]是从vector里取出的一个成员函数指针,它指向MyClass的某个符合签名的成员函数this是当前MyClass对象的指针,->*的作用就是把这个对象指针和成员函数指针绑定起来- 最后加上参数列表
(m_tuples[i]),就可以执行这个成员函数,把返回值赋值给status
补充个小细节:这里的括号(this->*m_processObjects[f])必须加,因为函数调用的优先级比->*高,如果不加括号,编译器会先尝试调用m_processObjects[f](m_tuples[i]),这显然不对,因为它是个指针不是函数。如果是用对象(不是指针),语法就是(obj.*func)(info),原理是一样的。
内容的提问来源于stack exchange,提问作者spring cc
相关产品推荐
相关产品推荐

