指向类成员的指针
先自定义一个类
class Test
{
public:
void func() { cout << "call Test::func" << endl; }
static void static_func() { cout << "Test::static_func" << endl; }
int ma;
static int mb;
};
int Test::mb;
- 指向成员变量的指针
- 指向普通成员变量
- 指向static成员变量
int main()
{
Test t1;
Test* t2 = new Test();
//int* p = &Test::ma; 报错,无法从int Test::*转换到int*
// p指向的是类作用域里的一个整形变量
// 普通成员变量调用依赖对象,定义指针时要加上类名作用域,解引用时一定要通过对象来调用
int Test::* p = &Test::ma;
t1.*p = 20;
cout << t1.*p << endl;
t2->*p = 30;
cout << t2->*p << endl;
// 定义一个指向static成员变量的指针
// static成员变量的调用不依赖于对象,定义指针时不用加上类名作用域,可以直接进行解引用
int* p1 = &Test::mb;
*p1 = 40;
cout << *p1 << endl;
delete t2; //堆上的对象一定记得用delete释放
return 0;
}
- 指向成员方法的指针
- 指向普通成员方法的指针
- 指向static成员方法的指针
int main()
{
Test t1;
Test* t2 = new Test();
//报错:无法从“void(__thiscall Test::*)(void)”转换为“void(__cdecl*)(void)”
//void (*pfunc)() = &Test::func;
// 1. 定义指向普通成员方法的指针,要加上类名作用域,调用时要依赖于对象
void (Test::*pfunc)() = &Test::func;
(t1.*pfunc)();
(t2->*pfunc)();
// 2. 定义指向static成员方法的指针, 不用加上类名作用域,调用时不依赖于对象
void (*pfunc2)() = &Test::static_func;
(*pfunc2)();
return 0;
}