class::data_member vs class_object.data_member

class::data_member vs class_object.data_member

本文关键字:member class data object vs      更新时间:2023-10-16

我刚刚看到一个帖子,其中我发现了以前从未见过的东西,简而言之,它是:

class A {
public:
    int _x;
};
void foo(A *a_ptr, int *m_ptr)
{
    cout << (*a_ptr).*m_ptr << endl;  // here
}
int main()
{
    A a;
    a._x = 10;
    foo(&a, &A::_x);   // and here
}

怎么可能呢?传入&A::_x,然后使用(*a_ptr).*m_ptr

我想,&A::_x总会指同一个地址,但不同的对象有不同的_x,怎么可能呢?

&A::_x是指向成员的指针,而不是指针。相反,将其视为某种相对构造,它告诉您在对象内部的哪个位置可以找到特定的成员元素。只有实例引用一起,才能找到由成员指针给出的该实例的实际子对象。

比较:

struct Foo { int x; int y; };
Foo a = { 1, 2 };
Foo b = { 3, 4 };
Foo c = { 5, 6 };
int * p = &a.x;  // ordinary pointer-to-int
int Foo::*pm = &Foo::x;             // pointer-to-member
int result = a.*pm + b.*pm + c.*pm; // aggregate Foo::x
// point to a different member:
pm = &Foo::y;
result = a.*pm + b.*pm + c.*pm;     // aggregate Foo::y
相关文章: