C++ 类::数据\u成员vs类\u对象。数据\u成员

C++ 类::数据\u成员vs类\u对象。数据\u成员,c++,C++,我刚刚看到了一个我从未见过的东西,简而言之就是: 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类{ 公众: int_x;

我刚刚看到了一个我从未见过的东西,简而言之就是:

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类{
公众:
int_x;
};
无效foo(A*A_ptr,int*m_ptr)
{

cout
&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

&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

这不应该编译,
&T::某些_成员
是成员(函数)指针,不可转换为任何类型的普通指针。这里有一个。如果在a中有一个函数,则可以将其作为回调提供,但x是data@NeelBasu,我也这么认为,但这正是我在那篇文章的答案中看到的。这不应该编译,
&T::某些成员
是一个成员(函数)指针,不可转换为任何类型的普通指针。这里有一个。如果在a中有一个函数,则可以将其作为回调提供,但x是data@NeelBasu,我也这么认为,但这正是我在那篇文章的答案中看到的。所以,它在C/C++中是合法的,不是吗?\n所以,它在C/C++中是合法的,不是吗\