通过上一篇文章,我在分析继承过程中对象的数据结构时,意外发现可以通过地址随意的访问对象的数据,无论是私有的还是公开的。
于是做了以下实验,通过实验可以看出来,内存中的数据,只要不是在常量区,只要你能获得目标的地址,你就可以修改它,无论是在const函数中,还是某类的私有成员变量。
代码:
1 #include2 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) const16 {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 B31 {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=2data1=3, data2=4>> 修改其它类的私有成员变量:data1=1, data2=2data1=5, data2=6请按任意键继续. . .