在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。linux
#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++之父說的那種,書中也只說了進行了特殊處理,而後就一帶而過了。指針