c++指向成员的指针

pointer to member

是什么?

  1. 指向成员的指针是一种“偏移量”式的结构,用来间接表示类中的某个成员(数据成员或成员函数)。它不是直接指向内存地址的指针,而是相对于类对象起始地址的偏移量,或者是与类相关联的一个索引。

  2. 运算符->*.*用于通过指向成员的指针来访问成员。可以说是C++中最专用和最少用的运算符。

    • .*通过对象和指向成员的指针访问成员
    • ->*通过指向对象的指针和指向成员的指针访问成员
  3. 指向成员的指针不能赋值给void*或任何其他普通指针,

  4. 空指针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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值