C++的訪問說明符(public private protected)提供了對類內部數據的訪問限制。我以前一直以為將成員說明為private就可以保證其數據不被外界讀取和改寫,直到現在發現自己誤解了。
且看這個小例子:
#include <iostream>
using namespace std;
class stru_a
{
public:
stru_a::stru_a();
private:
int m_int;
long m_long;
};
stru_a::stru_a()
{
m_int = 1865;
m_long = 9527;
}
int main()
{
stru_a a;
stru_a *p = &a;
//cout << a.m_int << endl; // 此路不通
cout << "m_int= "<< *( (int *)p ) << endl; // 1. 用指針讀取
*( (int *)p ) = 8888; // 2. 用指針修改
cout << "m_int= "<< *( (int *)p ) << endl;
cout << "m_long= "<< *( (long *)((char *)p + sizeof(int)) ) << endl; // 3.用指針讀取
}
/**//*
m_int= 1865
m_int= 8888
m_long= 9527
請按任意鍵繼續. . .
*/
從最後的運行結果可以看出,雖然m_int和m_long都是類的私有成員,但是仍然可以通過指針訪問。
關於其原因,《C++編程思想》上有一段解釋的很精辟,摘抄如下:
1. 在一個特定的訪問塊(被訪問說明符限定的一組聲明)內,成員變量在內存中是連續存放的;
2. 程序運行之前,所有的訪問說明都消失了....在程序運行期間,對象變成了一個存儲區域,別無他物(HateMath注:即訪問控制符只是在編譯時起作用,防止程序員誤訪問不該訪問的內容。如果你執意用別的方式訪問某個私有成員,C++編譯器沒法阻止。)。