利用指針突破C++編譯器的防線

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 類型也是無濟於事的,他們都沒法阻擋指針的穿透力!!!繼承

 

純屬娛樂,寫代碼的時候千萬不要真的這麼寫!編譯器

相關文章
相關標籤/搜索