通過操作地址的方法來訪問C++類對象中私人成員變數

來源:互聯網
上載者:User
      原則上,C++類中私人變數不允許在類之外的其他任何地方訪問,一般來說功能完善的類都會提供get,set方法來操作類屬性值,但如果沒有get、set方法都沒有提供,比如使用的是第三方提供的.o(或者動態庫)來進行開發的,並且實際應用中我們確確實實需要改變其中某個對象的一個私人參數,有沒有什麼辦法呢?我們知道,一個進程有程式段和資料區段,如果我們知道了對象的資料空間,那麼得到該對象的成員變數值也就很簡單了,而實際上,對象資料區段的首地址其實就是對象地址,以例子說明:
class A
{
public:
   int i;
   bool setJ(int _j){j = _j;};
   int getJ() const {return j;};
private:
   int j;
};

int main()
{
    A a;
   printf("a's address is %u.n",&a); // 列印對象a的地址
   printf("a.i's address is %u.n",(&(a.i))); // 列印對象a的成員變數i的地址
}

執行上面程式,可以看到結果,兩個值時一樣的,也就是說明對象地址就是第一個成員變數的地址。
我們知道,C++編譯器將資料和程式段分開,所有的類變數會按照聲明順序依次存入資料區段,所以,如果知道了第一個變數的地址,那麼後面的地址也就依次累加即可逐一求出了。有了變數地址,那麼也就可以對它的值進行修改了。還是以上面的例子來說明,一下程式編寫了如何更改類成員b的值:

int main()
{
    A a;
    a.setJ(2);
    printf("before modified:the member j of a is %d.n",a.getJ()); // 列印j的值。
    int *p = (int *)(int(&a) + sizeof(a.i));
    *p = 10;
    printf("after modified:the member j of a is %d.n",a.getJ()); // 列印j的值。
}

可以得出此時j成員變數的值由2變成10了。

總結:直接對地址空間操作,請小心為妙。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.