指向类数据成员的指针
定义
<数据类型><类名>::*<指针名>
赋值&初始化
<数据类型><类名>::*<指针名>[=&<类名>::<非静态数据成员>]
指向非静态数据成员的指针在定义时必须和类相关联,在使用时必须和具体的对象关联。
解引用
由于类不是运行时 存在的对象。因此,在使用这类指针时,需要首先指定类的一个对象,然后,通过对象来引用指针所指向的成员。
<类对象名>.*<指向非静态数据成员的指针>
<类对象指针>->*<指向非静态数据成员的指针>
zhangsan
lisi
wangwu
指向类成员函数的指针
定义一个指向非静态成员函数的指针必须在三个方面与其指向的成员函数保持一致:参数列表要相同、返回类型要相同、所属的类型要相同
定义
<数据类型>(<类名>::*<指针名>)(<参数列表>)
赋值&初始化
<数据类型>(<类名>::*<指针名>)(<参数列表>)[=&<类名>::<非静态成员函数>]
解引用
由于类不是运行时存在的对象。因此,在使用这类指针时,需要首先指定类的一个对象,然后,通过对象来引用指针所指向的成员。
(<类对象名>.*<指向非静态成员函数的指针>)(<参数列表>)
(<类对象指针>->*<指向非静态成员函数的指针>)(<参数列表>)
![](/i/l/?n=23&i=blog/2500450/202301/2500450-20230121161331555-683148034.png)
name zhangsan num 1002
name lisi num 1001
name lisi num 1003
与普通意义上的指针不一样。存放的是偏移量。因为类的初始化本身就是通过偏移量实现的,而且函数空间共享,数据空间不共享。指向非静态成员函数时,必须用类名作限定符,使用时则必须用类的实例作限定符。指向静态成员函数时,则不需要使用类名作限定符
![](/i/l/?n=23&i=blog/2500450/202301/2500450-20230121163136622-1368524887.png)
void f() 1
void g() 1
void h() 1
void i() 1
指向类静态成员的指针
指向类静态数据成员的指针
指向静态数据成员的指针的定义和使用与普通指针相同,在定义时无须和类相关联,在使用时也无须和具体的对象相关联。
指向类静态成员函数的指针
指向静态成员函数的指针和普通指针相同,在定义时无须和类相关联,在使用时也无须和具体的对象相关联。
因为他们的保存范围不在类内,而是在整个程序的文件保存区,所以在初始化的时候不需要加上命名空间,本质上<类名>::*<指针名>是一种命名空间的限定,说明定义的指针指向的是在<类名>::这一空间内函数/数据
100
100