• 如何访问其它类的私有成员变量,以及如何在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
    请按任意键继续. . .
  • 相关阅读:
    面试题:表示数值的字符串
    面试题:两个链表的第一个公共节点
    面试题:构建乘积数组
    面试题:二叉搜索树的第K个节点
    面试题:机器人的运动范围
    面试题:矩阵中的路径
    面试题:删除链表中的重复节点
    面试题:环形链表的入口节点
    python学习笔记——捌 ScoketServer
    python学习笔记——捌 scoket 例子
  • 原文地址:https://www.cnblogs.com/zanzan101/p/3405380.html
Copyright © 2020-2023  润新知