回 帖 发 新 帖 刷新版面

主题:等考二级C++:私有数据一定安全吗

http://www.educity.cn 作者:pc 来源:希赛教育
 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都是类的私有成员,但是仍然可以通过指针访问。

    关于其原因,如下:

    1. 在一个特定的访问块(被访问说明符限定的一组声明)内,成员变量在内存中是连续存放的;

    2. 程序运行之前,所有的访问说明都消失了....在程序运行期间,对象变成了一个存储区域,别无他物(HateMath注:即访问控制符只是在编译时起作用,防止程序员误访问不该访问的内容。如果你执意用别的方式访问某个私有成员,C++编译器没法阻止。)。

回复列表 (共1个回复)

沙发

这个结论有待商议,可能是因为编译器的原因吧;

我来回复

您尚未登录,请登录后再回复。点此登录或注册