程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 私有數據一定安全嗎?

私有數據一定安全嗎?

編輯:關於C++

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++編譯器沒法阻止。)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved