1、指向类成员变量的指针
1.1、普通成员变量
在进行解引用访问时,必须要依赖一个对象:
上面是不行的!
**定义对象:**t1在栈上,t2在堆上;
t1没有问题!
t2也没有问题。
t1和t2都需要依赖对象!
1.2、static成员变量
静态成员变量不依赖对象:
#include <iostream>
using namespace std;
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;
int main()
{
Test t1;
Test *t2 = new Test();
//int a=10; int *p=&a; *p=30;
//无法从“int Test::* ”转换为“int *”
int Test::*p = &Test::ma;
t1.*p = 20;//必须加上对象的调用,才能访问普通的成员变量或者成员方法
cout << t1.*p << endl;
t2->*p = 30;
cout << t2->*p << endl;
int *p1 = &Test::mb;//不依赖对象,普通指针指向就可以了
*p1 = 40;
cout << *p1 << endl;
delete t2;//堆上的对象要delete手动释放
return 0;
}
2、指向类成员方法的指针
2.1、普通成员方法
**注意:**普通成员方法是要依赖对象的!!!
这样是错误的。
解决方法:
普通成员方法是要依赖对象的!!!
2.2、类的static成员方法
#include <iostream>
using namespace std;
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;
int main()
{
Test t1;
Test* t2 = new Test();
//指向成员方法的指针
//无法从“void (__thiscall Test::* )(void)”转换为“void (__cdecl *)(void)”
void (Test:: * pfunc)() = &Test::func;
(t1.*pfunc)();
(t2->*pfunc)();
//如何定义函数指针指向类的static成员方法呢?
//定义一个普通的指针就可以了
void(*pfunc2)() = &Test::static_func;
pfunc2();
delete t2;//堆上的对象要delete手动释放
return 0;
}