指向数据成员的指针
飘飘白云
数据成员的指针有两种含义,一种是没有绑定具体对象的数据成员指针,其地址实际是该数据成员在类布局结构中的位移;另一种是绑定了具体对象的的数据成员指针,其地址是该对象的该数据成员在内存中的地址。下面参照书中的例子用vs2005中在32位的机器上写了个测试程序。
数据成员的指针有两种含义,一种是没有绑定具体对象的数据成员指针,其地址实际是该数据成员在类布局结构中的位移;另一种是绑定了具体对象的的数据成员指针,其地址是该对象的该数据成员在内存中的地址。下面参照书中的例子用vs2005中在32位的机器上写了个测试程序。
输出结果:
第一行是输出8,可以理解,前面有两个整型数据(4+4 = 8),故位移为8;
第二行理应输出4,但在vs2005中得到的是0,大概是编译器做了些类似于空基类的优化处理。
第三行是输出内存地址以及5。
#include <stdlib.h>
class Base1 {
public:
int value1;
};
class Base2 {
public:
int value2;
};
class Derived :
public Base1,
public Base2 {
public:
int value3;
};
int _tmain(int argc, _TCHAR* argv[])
{
printf("/n Point to class's data member %p./n", &Derived::value3);
printf("/n Point to class's data member %p./n", &Derived::value2);//It should be 4,but it is 0.
int Derived:: *pVal3 = &Derived::value3;
Derived object;
object.*pVal3 = 5;
printf("/n Point to object's data member %p, value is %d./n", &(object.*pVal3), object.*pVal3);
system("pause");
return 0;
}