私有数据必然安详吗?
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++编译器没法阻止。)。