通过上一篇文章,我在分析继承过程中对象的数据结构时,意外发现可以通过地址随意的访问对象的数据,无论是私有的还是公开的。
于是做了以下实验,通过实验可以看出来,内存中的数据,只要不是在常量区,只要你能获得目标的地址,你就可以修改它,无论是在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 ", 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标识的函数修改成员变量: "); 50 A a; 51 a.display(); 52 a.const_function(3, 4); 53 a.display(); 54 55 printf(">> 修改其它类的私有成员变量: "); 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 请按任意键继续. . .