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語言而留下的一些不是很安全的做法。