指针是指向一些内存地址的变量,既可以是数据的地址也可以是函数的地址。所以,可以在运行时改变指针指向的内容。C++的成员指针(pointer-to-member)遵从同样的概念,除了所选择的内容是在类中之内的成员指针。这里麻烦的是所有的指针需要地址,但在类内部是没有地址的;选择一个类的成员意味着在类中偏移。只有把这个偏移和具体对象的开始地址结合,才能得到实际地址。成员指针的语法要求选择一个对象的同时间接引用成员指针。
为了理解这个语法,先考虑一个简单的结构:如果有一个这样结构的指针sp和对象so,可以通过下面方法选择成员:
// SimpleStructure.cpp
struct Simple ...{ int a; };
int main() ...{
Simple so, *sp = &so;
sp->a;
so.a;
}
*ip= 4;
objectPointer->*pointerToMember = 47;
object.*pointerToMember = 47;
int ObjectClass::*pointerToMember;
int ObjectClass::*pointerToMember = &ObjectClass::a;因为仅仅提高了一个类而非那个类的对象,所以没有ObjectClass::a的确切“地址”。因为,&ObjectClass::a仅是作为成员指针的语法被使用。
下面例子说明了如何建立和使用指向数据成员的指针:
// PointerToMemberData.cpp
#include <iostream>
using namespace std;

class Data ...{
public:
int a, b, c;
void print() const ...{
cout << "a = " << a << ", b = " << b
<< ", c = " << c << endl;
}
};

int main() ...{
Data d, *dp = &d;
int Data::*pmInt = &Data::a;
dp->*pmInt = 47;
pmInt = &Data::c;
dp->*pmInt = 49;
dp->print();
}
a = 47, b = xxxx(随机值), c = 49另外,成员指针是受限制的,它们仅能被指定给在类中的确定的位置。例如,我们不能像使用普通指针那样增加或比较成员
指针。
以上摘至《C++编程思想》第一卷。
1527

被折叠的 条评论
为什么被折叠?



