C/C++黑魔法-無限制訪問私有屬性

C++的private用於限制成員或函數的可見性,主要是爲了避免誤用和降低維護成本。

  有些人卻認爲,我的就是我的,不要你覺得,我要我覺得。即使不能直接訪問私有成員,我也要找其他的方式來訪問。來看看有哪些訪問私有屬性的方法吧。

通過編譯參數開啓

-fno-access-control是gcc編譯器選項,可以直接開啓訪問私有屬性大門。主要多用於單元測試

通過對象的偏移地址訪問

  C++的對象可以看作是一個指針數組。這個指針數組存放的是對象的虛函數表和數據成員的地址。既然是指針數組,當然可以通過指針來訪問對象的任何成員。如例子:

class Test
{
public:
    void print()
    {
        printf("%d %d %d\n", m_a, m_b, m_c);
    }

private:
    int m_a;
    int m_b;
    int m_c;
};

int main(int argc, char *argv[])
{
    Test t;
    int *a = (int *)&t+0; /* m_a的地址 */
    int *b = (int *)&t+1; /* m_b的地址 */
    int *c = (int *)&t+2; /* m_c的地址 */
    *a = 10;
    *b = 20;
    *c = 30;

    t.print();
	return 0;
}

  輸出:

10 20 30

使用宏替換

  使用下列宏用來把private關鍵詞替換爲public從而開啓訪問私有屬性的大門。

#define private public

一些觀點

  似乎有些人認爲,類中的public,protected,private是理所當然存在的,說編程上的類可以模擬生活中的事物。Qt君認爲其實不然,爲什麼會製造出訪問級別,主要是限制用戶亂用。但是即使有這種機制也會架不住用戶不懂的亂用。

關注公衆號Qt君,第一時間獲取最新推送。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章