指向成员函数的指针

Pointer to a member function

本文关键字:指针 函数 成员      更新时间:2023-10-16

有结构

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

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

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

和使用

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

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

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

c++中指向成员的指针可以理解为"偏移量"定义。虽然当你使用虚函数等时会有一些复杂的情况,但在你的情况下,这已经足够好了。

所以,基本上你的代码就像(如果我们把数据类型变成"原始"数据)
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++指针算术,这有点跑题,因为它与这里的问题无关,所以我给了一些关于这个主题的进一步参考。

指针算术http://www.technoplaza.net/programming/lesson9p2.php

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