指向成员函数的指针

Dar*_*lyn 7 c++ rvalue pointer-to-member c++11

有结构

struct Person{
    Person( int i , int g):id(i),age(g){};
    int id;
    int age;
};
Run Code Online (Sandbox Code Playgroud)

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

int extract( Person * p , int Person::* param)
{   
    return p ->*param;
}
Run Code Online (Sandbox Code Playgroud)

并使用

Person *p = new Person (10 , 20 );
cout << extract(p , &Person::id )<< endl;
Run Code Online (Sandbox Code Playgroud)

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

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

Ear*_*ine 6

使用C++中的成员指针可以理解为"偏移"定义.虽然有虚拟功能等有一些复杂功能,但在你的情况下,这已经足够了.

所以,基本上你的代码就像(如果我们将数据类型转换为"原始"数据)

int extract(void *p, int offset)
{
    return *((int*)(p+offset));
}
Run Code Online (Sandbox Code Playgroud)

(从技术上讲,上面的代码不是编译的,因为void *指针不能用于另外的表达式,因为编译器不知道指针的大小,但是现在让我们忽略它.)

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

extract(p, __offsetof(Person, id));
Run Code Online (Sandbox Code Playgroud)

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

你可以看到这里没有魔力.C++可以帮助您的是,偏移在特殊数据类型中受到保护,因此您不允许更改其内部,因此避免分开.

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

上面的代码对于C/C++用户来说是非常基础的,尽管它不是C++专业人员想要看到的形式(应该使用static_castreinterpret_cast代替C stype转换).

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

指针算术

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

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