private成员变量真的私有吗?(用指针刨他祖坟)

时间:2021-07-05 05:05:56

今天写程序时突然想到的,为什么不用指针去获取类的成员变量呢。于是做了这个实验。首先定义了一个类:

 class Test {
private:
int i;
char c;
int* p;
public:
Test(int i,char c,int* p)
:i(),c('Q'),p(new int()){}
~Test(){delete p;}
};

  有三个private的成员变量。该类型的对象在内存中的分布应该是这样的:

private成员变量真的私有吗?(用指针刨他祖坟)

  占12个字节,其中5-8字节三个字节是为了对其后边int*变量,不存放数据。

  分析完了内存分布,获取对象的地址也很方便,于是就可以用指针拿数据了。

 int main()
{
Test t(,,NULL);
cout << *(int*)&t << endl;
cout << *((char*)&t+) << endl;
//(int*)&t+2拿到p对应的内存地址
//解应用拿到p的值
//在将p转换成int*,解应用拿到堆中数据。
cout << *(int*)(*((int*)&t+)) << endl;
//最后一步也可以不进行两次转换
//但是需要用二级指针
//cout<< **((int**)&t+2) << endl;
}

  输出结果:

  998
  Q
  9999

  与构造函数保持了一致。

  所以c++的私有成员变量,根本就不私有嘛。= =!