保护稀有动物网站建设策划书,四川省城乡住房与建设厅网站首页,广州免费高速,wordpress速度慢啊1、成员变量偏移值
#xff08;1#xff09;
成员变量偏移值#xff0c;就是指这个成员变量的地址离对象首地址偏移了多少字节#xff0c;这个偏移值在编译完成后是不变的。
class Base {
public:int b_i;int b_j;
};int main()
{Base base;printf( b_i的偏移值:%…1、成员变量偏移值
1
成员变量偏移值就是指这个成员变量的地址离对象首地址偏移了多少字节这个偏移值在编译完成后是不变的。
class Base {
public:int b_i;int b_j;
};int main()
{Base base;printf( b_i的偏移值:%d\n, Base::b_i);printf( b_j的偏移值:%d\n, Base::b_j);return 0;
}
根据前面所学的知识我们知道这个Base类的对象布局如下所示 变量b_i在对象的开头位置所以偏移值应该为0int类型的长度是4所以b_j的偏移值应该为4。
执行程序后输出结果如下 2
下面我们给Base类添加1个虚函数看这个时候b_i、b_j的偏移值是多少
class Base {
public:int b_i;int b_j;virtual void print(){}
};
这个时候Base类对象的开头位置会增加一个4字节的虚函数表指针b_i、b_j的位置会往下移动4个字节。这时b_i的偏移值应该是4b_j的偏移值
应该是8。 执行程序后输出结果如下 2、成员变量地址
类的静态变量是跟着类走的它的地址在编译后是不变的。
类的非静态变量是在类对象里的每次运行生成一个新对象它的地址就会发生变化。
我们可以用下面的代码做个验证
class Base {
public:int b_i;int b_j;static int b_s;
};
int Base::b_s 1;int main()
{Base base;printf( b_i的地址:%d\n, base.b_i);printf( b_j的地址:%d\n, base.b_j);printf( b_s的地址:%d\n, base.b_s);return 0;
}
运行发现变量b_i、b_j的地址每次都不一样但b_s的值都是相同的。