C++ 面向對象的一大特性就是封裝,使用不一樣的訪問控制符來控制外接對其的訪問權限。好比:ios
1 class A 2 { 3 public: 4 A(): i(10){} 5 void print(){ cout << "A::i = " << i << endl; } 6 7 private: 8 int i; 9 };
這裏的A 類對象的 i 對外接來講就是透明的。經過private 來隱藏對象的某些屬性。可是,C++也繼承了大部分C的特性,好比說很好很強大的指針。利用指針,咱們能夠繞過編譯器作一些 見不得光的事情。雖然不建議這麼作,由於這樣不只破壞了數據的封裝特性,也會帶來不少危險。不過這裏我仍是這麼作了。。。。。spa
請看下面的這個例子,利用指針p去修改 對象a 的私有成員i 的值:指針
1 /*========================================================*\ 2 * 利用指針突破C++編譯器的防線 3 * 4 * 樊列龍 2013/6/22 5 * 6 \*========================================================*/ 7 8 #include <iostream> 9 using namespace std; 10 11 class A 12 { 13 public: 14 A(): i(10){} 15 void print(){ cout << "A::i = " << i << endl; } 16 17 private: 18 const int i; 19 }; 20 21 int main() 22 { 23 A a; 24 25 int* p = (int*)&a; // 突破編譯器的防線 26 a.print(); 27 28 *p = 30; // 偷偷修改a 對象私有成員的值 29 a.print(); 30 31 return 0; 32 }
執行結果:code
A::i = 10 A::i = 30
經過打印結果能夠看出p 真的作了不應作的事情對象
這時候有的朋友可能會以爲將A 類中的 i 聲明成 const int 指針p應該就無能爲力了吧。blog
事實證實 私有成員變量及時是 const 類型也是無濟於事的,他們都沒法阻擋指針的穿透力!!!繼承
純屬娛樂,寫代碼的時候千萬不要真的這麼寫!編譯器