通过指针访问C++对象的私有成员
C++对象的私有成员是禁止类外的访问的。但是我们仍然可以通过指针访问C++对象的私有成员。
#include <iostream> using namespace std; class A { public: A(int i = 0) :m_i(i) {} void print() { cout << "m_i" << this->m_i << endl; } private: int m_i; }; int main(int argc, char **argv) { A a(10); // 初始化后的a的私有变量是10 a.print(); //可以通过指针访问a中的m_i变量 int *pi = (int *)&a; cout << "a::m_i: " << *pi << endl; //通过指针更改m_i *pi = 11; //我们看到对象a中的私有变量m_i已经被改变 a.print(); return 0; }
运行结果:
m_i: 10 a::m_i: 10 m_i: 11
在上面代码中,a对象有一个私有的数据成员m_i,原则上在类外部是不能对m_i进行访问的。但是我们可以通过地址访问对象的私有数据成员m_i。并且还对其进行了修改。运行结果也表明我们确实可以通过指针访问对象的私有成员并且可以对其进行修改。
究其原因,在C++中访问对象的数据成员,可以根据数据在对象中的偏移地址访问。C++的对象其实就是一个指针数组。这个指针数组存放的是对象的虚函数表和数据成员的地址,我们当然可以通过指针访问对象的任何成员。我想着可能是C++为了兼容C语言而留下的一些不是很安全的做法。