pointer to member
是什么?
-
指向成员的指针是一种“偏移量”式的结构,用来间接表示类中的某个成员(数据成员或成员函数)。它不是直接指向内存地址的指针,而是相对于类对象起始地址的偏移量,或者是与类相关联的一个索引。
-
运算符
->*和.*用于通过指向成员的指针来访问成员。可以说是C++中最专用和最少用的运算符。.*通过对象和指向成员的指针访问成员->*通过指向对象的指针和指向成员的指针访问成员
-
指向成员的指针不能赋值给
void*或任何其他普通指针, -
空指针
nullptr可以赋值给指向成员的指针,此时它表示“无成员”
举例说明
定义一个类
class A{
public:
int x;
void f(){std::cout << "x:" << x << std::endl;}
}
定义指向数据成员和函数成员的指针
int A::*p_to_x = &A::x; // 这里要带上类型,不用用普通指针声明
void (A::*p_to_f)() = &A::f;
然后通过对象或对象指针来访问
A a;
A* p = &a;
a.*p_to_x = 10; // 通过对象+指向成员的指针访问数据成员
(a.*f)(); // 通过对象+指向成员的指针访问成员函数
p->*p_to_x = 20; // 通过对象指针访问
(p->*f)();
与普通指针的区别
指向成员的指针不能转换为void*,因为它不是一个绝对地址,而是相对类对象的偏移。它需要与一个对象结合才能使用。
就像你知道房间号(指向成员的指针),也必须知道楼层号(对象)才能找到对的房间楼层号+房间号,
可以将空指针nullptr赋值给指向成员的指针,表示它不指向任何成员。
使用场景
回调、泛型编程、访问类成员,成员的选择在运行时决定。
// 示例:根据字符串动态访问成员
class Employee {
public:
string name;
int salary;
string department;
};
// 成员指针映射表
map<string, string Employee::*> field_map = {
{"name", &Employee::name},
{"dept", &Employee::department}
};
Employee emp;
string field_name = "name";
cout << emp.*field_map[field_name]; // 动态访问 emp.name

662

被折叠的 条评论
为什么被折叠?



