#include <cstdlib> #include <iostream> using namespace std; class Point3D { public: Point3D(int _x, int _y, int _z):x(_x),y(_y),z(_z){} float x, y, z; float getX(){return x;} float getY(){return y;} float getZ(){return z;} }; int main(int argc, char *argv[]) { /*去一个nonstatic data member的地址,将会得到它在class中的offset(偏移量)。 取一个“绑定于真正class object身上的class member”的地址,将会得到该member在内存中的真正地址。*/ //打印x,y,z的偏移量 printf("%p/n", &Point3D::x); printf("%p/n", &Point3D::y); printf("%p/n", &Point3D::z); printf("%p/n", &Point3D::getX); cout<<typeid(&Point3D::x).name()<<endl<<endl; Point3D point(1, 2, 3); //打印对象point中成员x, y, z在内存中的地址 printf("%p/n", &point.x); printf("%p/n", &point.y); printf("%p/n", &point.z); cout<<typeid(&point.z).name()<<endl; system("PAUSE"); return EXIT_SUCCESS; } #include <cstdlib> #include <iostream> using namespace std; class X{}; class Y : public virtual X{}; class Z : public virtual X{}; class A : public Y, public Z{}; int main(int argc, char *argv[]) { cout<<"sizeof(X) = "<<sizeof(X)<<endl; //1 //针对空类,是1个字节,那是因为编译器隐晦地安插进去的一个char,这使得这个class的两个 //objects得以在内存中配置独一无二的地址 X a, b; if(&a == &b) { cout<<"a与b地址相同"<<endl; } else { cout<<"a与b地址不相同"<<endl; } //因为类X中有一个members(编译器隐晦添加上的char),那么这个char会被继承到空类Y,Z,A中, //这样,类Y, Z中就不需要一个char,但是类Y, Z中各含有一个指针,指向虚父类X。 cout<<"sizeof(Y) = "<<sizeof(Y)<<endl; //4 cout<<"sizeof(Z) = "<<sizeof(Z)<<endl; //4 cout<<"sizeof(A) = "<<sizeof(A)<<endl; //8 system("PAUSE"); return EXIT_SUCCESS; }