如果我可以在类中使用指向变量的普通指针,那么类成员指针的重点是什么?

Tru*_*eon 1 c++ pointers class member

拿这个代码:

struct mystruct
{
    int var;

    mystruct() : var(0) {}
};

int main()
{
    mystruct ins;

    int* p = &ins.var;

    *p = 1;
}
Run Code Online (Sandbox Code Playgroud)

那么什么是类成员指针使用的具体非常好的例子呢?

int    X::*p = &X::data; /* p contains offset */
X      object;
X      *objptr = new X;

int    i = object.*p;
int    j = objptr->*p;
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 8

看来你的问题是关于指针到数据成员类型的指针.在C++中,还有指向成员函数类型的指针.这两者在某种抽象层面上有一些共同之处,但除此之外它们是不同的.

指向数据成员类型的指针适用于该类的任何实例.普通指针始终指向该类的特定实例的成员.指向数据成员类型的指针是从类对象开头的"运行时偏移"概念的更高级实现.它是一个相对指针.以这种方式,它与普通指针完全不同,普通指针是绝对指针.

为了说明一个例子,假设你有一个包含三个相同类型成员的类数组x,y并且z

struct Point { int x, y, z; };

Point point_array[N];
Run Code Online (Sandbox Code Playgroud)

并且您需要0在整个数组中设置具有相同名称的所有成员,而不更改任何其他成员.以下是使用指针指向数据成员类型的指针的方法

void zero_members(Point points[], int n, int Point::*m) {
  for (int i = 0; i < n; ++i)
    points[i].*m = 0;
}
Run Code Online (Sandbox Code Playgroud)

现在,通过使用此功能,您可以做到

zero_members(point_array, N, &Point::x);
Run Code Online (Sandbox Code Playgroud)

将所有xs设置为零.或者你可以做到

zero_members(point_array, N, &Point::y);
Run Code Online (Sandbox Code Playgroud)

将所有ys设置为零.您可以使用单个函数完成所有这些操作,同样重要的是,成员选择由运行时参数执行(而不是编译参数).

你不能用普通的指针做这样的事情.事实上,你不能以任何其他方式做到这一点.