指向成员函数的指针
Pointer to a member function
有结构
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_cast
或reinterpret_cast
代替C类型转换)。
我看到提问者问进一步解释C/c++指针算术,这有点跑题,因为它与这里的问题无关,所以我给了一些关于这个主题的进一步参考。
指针算术http://www.technoplaza.net/programming/lesson9p2.php
http://www.informit.com/articles/article.aspx?p=686170& seqNum = 8
相关文章:
- 如何正确编写指针函数声明?
- C++常规指针函数或模板
- 如何重新定义 C++ 指针函数?
- C++ 指向其他类函数的指针函数
- 指针到指针函数参数
- 将指向成员的指针函数传递到模板中
- C++ 在 none 常量指针函数中返回一个常量指针
- 如何使用指针函数编写/读取数组
- 是C 中的函数指针函数对象
- 如何从另一个类调用指向成员的指针函数
- 如何声明采用指向成员的指针函数的函数
- 如何构造一个以可变参数指针函数作为成员的类?
- c 通过值或指针函数语法
- 将typedef方法作为指针函数传递
- 从 Main 中的双指针函数打印出指针数组
- strcpy 对指针函数的引用
- 这是否仍然声明一种指针函数的别名?
- 将指向成员的指针函数与 std::shared_ptr 结合使用
- 'Incomplete type' 为标准::函数声明指向成员的指针函数模板参数时出错
- 从注入进程的 DLL 调用函数并更改指针函数的地址