如何访问其它类的私有成员变量,以及如何在CONST函数中修改成员变量

通过上一篇文章,我在分析继承过程中对象的数据结构时,意外发现可以通过地址随意的访问对象的数据,无论是私有的还是公开的。

于是做了以下实验,通过实验可以看出来,内存中的数据,只要不是在常量区,只要你能获得目标的地址,你就可以修改它,无论是在const函数中,还是某类的私有成员变量。

代码:

 1 #include <stdlib.h>
 2 
 3 /***
 4 * @author:zanzan101
 5 */
 6 
 7 // 测试如何在const函数中修改成员变量
 8 class A
 9 {
10 private:
11     int data1;
12     int data2;
13 public:
14     A(): data1(1), data2(2){}
15     void const_function(int d1, int d2) const
16     {
17         int* p;
18         p = (int*)(unsigned int)&data1;
19         *p = d1;
20         p = (int*)(unsigned int)&data2;
21         *p = d2;
22     }
23     void display()
24     {
25         printf("data1=%d, data2=%d\n", data1, data2);
26     }
27 };
28 
29 // 测试访问其他类的私有成员变量
30 class B
31 {
32 private:
33     A a;
34 public:
35     void set_a_data(int d1, int d2)
36     {
37         *(int*)&a = d1;
38         *(((int*)(&a))+1) = d2;
39     }
40     void display()
41     {
42         a.display();
43     }
44 };
45 
46 
47 int _tmain(int argc, _TCHAR* argv[])
48 {
49     printf(">> 通过const标识的函数修改成员变量:\n");
50     A a;
51     a.display();
52     a.const_function(3, 4);
53     a.display();
54 
55     printf(">> 修改其它类的私有成员变量:\n");
56     B b;
57     b.display();
58     b.set_a_data(5, 6);
59     b.display();
60 
61     system("pause");
62     return 0;
63 }

输出结果:

>> 通过const标识的函数修改成员变量:
data1=1, data2=2
data1=3, data2=4
>> 修改其它类的私有成员变量:
data1=1, data2=2
data1=5, data2=6
请按任意键继续. . .

 

posted @ 2013-11-03 20:30  铁甲小宝  阅读(670)  评论(0编辑  收藏  举报