助记符和指向成员语法的指针

Mnemonics and the pointer-to-member syntax

本文关键字:语法 指针 成员 助记符      更新时间:2023-10-16

指向-(数据(成员的指针在这里进行了说明(根据这个答案:https://stackoverflow.com/a/670744/4416169(

#include <iostream>
using namespace std;
class Car
{
public:
void carFunc(){}//added this myself
int speed;
};
int main()
{
int Car::*pSpeed = &Car::speed;
Car c1;
c1.speed = 1;       // direct access
cout << "speed is " << c1.speed << endl;
c1.*pSpeed = 2;     // access via pointer to member
cout << "speed is " << c1.speed << endl;
return 0;
}

为了记住这些指向数据成员的指针的行为,将它们视为存储指向指向数据成员中的内存偏移量,这是否有用,并且至少部分准确?然后,这个内存偏移量将被添加到特定类实例的内存位置,该类实例用于访问指向该特定实例中数据成员的指针。

若这个助记符有缺陷,那个么对于指向数据成员的指针还有什么更好的助记符呢?

然后是指向成员函数的指针的情况:

void (Car::*fptr)() = &Car::carFunc;

将这些指向成员函数的指针想象成简单干净的函数指针,指向指定的成员函数,除此之外,还隐式地从调用它们的实例中获取this指针,这是否正确?

为了记忆这些指向数据成员的指针的行为,将它们视为存储指向指向指向数据成员中的内存偏移量是否有用,并且至少部分准确?

当然。

将这些指向成员函数的指针想象成简单干净的函数指针是否正确

就它们的使用方式而言,指向成员函数的指针确实与使用的函数指针非常相似,只是语法不同。然而;助记符";在考虑虚拟功能时失败。仅仅指向函数的指针是不足以使其工作的。

我想说,虽然它可能是一个诱人的助记符,但我会警告不要使用它。

指向成员的指针与常规指针大不相同,尽早在他们的脑海中设定这种区别会让人受益。以后可能会省去很多悲伤。例如,

PtrType1 p = getPtrType1P();
PtrType2 z = reinterpret_cast<PtrType2>(p);
PtrType1 k = reinterpret_cast<PtrType1>(z);

只要PtrType1和PtrType2是规则指针,就会产生完全可用的k。但是,如果其中一个是成员指针,则这将不再是有效的代码。请记住,指向虚拟函数成员的指针通常为16字节长(是常规指针大小的两倍(。

我认为,更好的助记符是将指向成员的指针理解为它们是什么——这是一种间接访问给定指针的类成员的方法