指向成员函数的指针

Pointer to a member function

有结构

struct Person{
    Person( int i , int g):id(i),age(g){};
    int id;
    int age;
};

我可以通过将指向成员数据的指针作为参数传递给函数来动态 return 成员数据。例如

int extract( Person * p , int Person::* param)
{   
    return p ->*param;
}

并使用

调用
Person *p = new Person (10 , 20 );
cout << extract(p , &Person::id )<< endl;

但我的问题是,为什么这样做有效?我们传递的 &Person::id 基本上是 memory ,但是 Person 是一个违反定义的右值。

感谢所有对我可能对主题的误解的解释/澄清。 谢谢

C++中成员指针可以理解为"offset"定义。虽然当你有虚函数等时会有些复杂,但在你的情况下这已经足够了。

因此,基本上您的代码就像(如果我们将数据类型转换为 "raw" 数据)

int extract(void *p, int offset)
{
    return *((int*)(p+offset));
}

(从技术上讲,上面的代码是无法编译的,因为 void * 指针不能用于加法表达式,因为编译器不知道指针的大小,但我们暂时忽略它。 )

当你调用它时,代码看起来像

extract(p, __offsetof(Person, id));

其中__offsetof是一个伪运算符,编译器会在编译时计算它。

你可以看到这里没有魔法。 C++ 可以帮助您的是偏移量在特殊数据类型中受到保护,因此您不能更改其内部,从而避免破坏。

有关 C/C++ 指针转换和算术的其他信息

上面的代码对于 C/C++ 用户来说是非常基础的,尽管它不是 C++ 专业人士希望看到的形式(应使用 static_castreinterpret_cast 而不是C 型铸造)。

我看到提问者进一步解释了 C/C++ 指针算法,这有点离题,因为它与这里提出的问题无关,所以我进一步给出一些有关此主题的参考。

Pointer Arithmetic

http://www.technoplaza.net/programming/lesson9p2.php

http://www.informit.com/articles/article.aspx?p=686170&seqNum=8