类的私有变量在类外是不能访问的,但是这种保护机制仅仅是在编译器编译阶段来检查的,和const是一样,通过指针,在执行期间通过特殊手段我们还是可以访问并且修改的,因为一个类的对象仅仅包括自己的成员数据,所有的成员函数和静态成员变量都是一个实体,该类的所有对象共享这个实体,因此对象的长度是该类所有auto变量的长度,如果该类或者其基类有虚函数,生成的对象还要加上虚函数表的指针的大小,就是vptr的大小,4个字节。
数据成员在对象中的排列顺序和类声明时候的数据的先后顺序一样,对应着内存分布,如果是多重继承,顺序和继承的先后顺序有关。其数据分布不做过多解释。
在执行期间,通过指向对象的指针进行类型转换和指针偏移可以得到指向该对象成员的指针,通过这个指向该对象成员的指针就可以访问其成员的数据了。从底层角度讲,我们已知该对象的地址,我们首先得使用指针运算获取到某成员的地址,(这里还要牵扯到内存对齐问题)通过该地址获取到成员的数据,并对其操作。
参看Demo
#include <iostream>
using namespace std;
class TestClass
{
public: