0

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

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的,怎么可能呢?

4

1 回答 1

3

&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
于 2012-08-14T07:58:38.027 回答