利用指针突破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 类型也是无济于事的,他们都没法阻挡指针的穿透力!!!继承

 

纯属娱乐,写代码的时候千万不要真的这么写!编译器

相关文章
相关标签/搜索