->*
和.*
是两个‘二元运算符
’ , 用来操作类成员变量和函数
&class::member
: 对于member为 nonstatic
的变量, 取值后返回的是变量在对象内的偏移位置
。对于static
的成员变量,返回的是成员地址。 nonstatic和static变量取值都可以直接用*
。&class::func
: 返回的是成员函数的地址。对于nonstatic
函数,通过返回的指针调用函数需要用二元运算符.*
或者->
, 对于static
函数则直接用 *
解引用即可,static函数和普通c函数一样的调用。.*
和->*
的两个参数分别是 对象指针 和 对象内的非static函数指针- 取类成员非static变量取值后返回的是偏移位,是个整型。 那么能不能对一个整型进行static_cast或reinterpret_cast转换,转换成类成员的偏移值呢? --这是不行的。
#include<iostream>
using namespace std;
class classTest {
public:
classTest(int tmpA) : innerA(tmpA) {};
public:
void print() { cout << "classTest::print() 123" << endl; }
void print2() { cout << "classTest::print2() 456" << endl; }
int innerA;
int innerA2;
static int stA;
static void printSt() { cout << "classTest::printSt" << endl; }
};
int classTest::stA = 33;
void outPrint() { cout << "outPrint 222" << endl; }
int main()
{
cout << typeid(&classTest::print).name() << endl;
cout << typeid(&classTest::innerA).name() << endl;
printf("\n--%x--\n", &classTest::innerA2);
printf("\n--%x--\n", &classTest::innerA);
printf("\n--%x--\n", &classTest::print2);
printf("\n--%x--\n", &classTest::print);
printf("\n--%x--\n", &classTest::stA);
classTest ct(3);
int *pI = &ct.innerA;
cout << *pI << endl;
void (classTest::*pp)() = &classTest::print;
(ct.*pp)();
(ct.*(&classTest::print2))();
void (*p)() = outPrint;
(*p)();
p();
cout << p << endl;
cout << typeid(pp).name() << endl;
cout << typeid(p).name() << endl;
cout << typeid(classTest::printSt).name() << endl;
cout << &classTest::printSt << endl;
void (*ppS)() = &classTest::printSt;
ppS();
(*ppS)();
cout << &classTest::stA << endl;
getchar();
}
参考:
C++ 获取类成员函数地址方法 浅析