在C++中class中Data Members的指针代表的是Data Member在class object中的位置偏移(offset)。如果一个Data Member在class object的开始位置,那么它的offset就是0,但是C++之父认为这样是不行的,其在将offset+1作为Data Member的offset,即如果一个Data Member在class object的开始位置,那么它的offset就是1。它这么做的原因是来区分“没有指向Data Member的指针”和“指向第一个Data Member的指针”。书中说vs在设计时不是这样的,其如果一个Data Member在class object的开始位置,那么它的offset就是0。
#include <cstdio>
class X {
public:
static void fun() {
printf("%d\n", &X::a);
printf("%d\n", &X::b);
printf("%d\n", &X::m);
printf("%d\n", &X::n);
printf("%d\n", &X::x);
printf("%d\n", &X::y);
}
int a;
int b;
protected:
int m;
int n;
private:
int x;
int y;
};
int main()
{
X::fun();
return 0;
}

结果如上,是这样的。
然后我在到linux下使用g++试试。
也是一样的,都没有使用C++之父说的那种,书中也只说了进行了特殊处理,然后就一带而过了。