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君,第一時間獲取最新推送。