zoukankan      html  css  js  c++  java
  • 如何访问其它类的私有成员变量,以及如何在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
    ", 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
    请按任意键继续. . .
  • 相关阅读:
    Android学习地址
    Android动画设计源码地址
    chromeWebBrowser之浏览器开发
    win8.1蓝屏解决
    打包应用程序
    win8.1解决鼠标右键反应慢的问题
    Rewrite服务器和robots文件屏蔽动态页面
    第08组 Alpha事后诸葛亮
    第08组 Alpha冲刺(6/6)
    第08组 Alpha冲刺(5/6)
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3405380.html
Copyright © 2011-2022 走看看