借助指针突破访问权限的限制,访问类的私有成员变量

在正常情况下,我们直接访问对象的私有变量,编译器会报错,那么有没有办法可以直接访问呢?有的,我们可以借助指针的方式去访问,类里面的成员是按顺序在内存里存放的,那么我们获得类的第一个成员的地址(即类对象的地址,这个可以自行验证),再根据各个成员变量的长度,即可获取每一个成员变量的地址。

PS:不能单纯考虑成员的实际类型,比如char,就认为它占1字节,需要考虑内存对齐的情况,我们可以借助命令:cl [filename].cpp /d1 reportSingleClassLayout[className]查看内存模型

TestA的内存模型:
TestA内存模型.png

TestB的内存模型:
TestB内存模型.png

程序代码:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;

class TestA {
private:
    int m_a;
    char m_b;
    float m_c;
public:
    TestA(int a, char b, float c);
    void show();
};
TestA::TestA(int a, char b, float c) :m_a(a), m_b(b), m_c(c) {};

void TestA::show() {
    cout <<"通过public方法访问:"<<endl << m_a << "-" << m_b << "-" << m_c << endl;
}

class TestB {
private:
    int m_a;
    char m_b;
    double m_c;
    int m_d;
public:
    TestB(int a, char b, double c, int d);
    void show();
};
TestB::TestB(int a, char b, double c, int d) :m_a(a), m_b(b), m_c(c), m_d(d) {};
void TestB::show() {
    cout << "通过public方法访问:" << endl << m_a << "-" << m_b << "-" << m_c<<"-" << m_d << endl;
}

int main() {
    TestA testA(20, 'A', 40.5f);
    int x = *(int*)&testA;
    char y = *(char*)((char*)&testA + sizeof(int));
    float z = *(float*)((char*)&testA + sizeof(int) + sizeof(int));
    cout << "-------TEST A----"<<endl;
    testA.show();
    cout <<"外部通过内存地址访问类的private变量:"<<endl<< x << "-" << y << "-" << z << endl;

    TestB testB(10, 'B', 30.52,20);
    int x1 = *(int*)&testB;
    char y1 = *(char *) ((char *)&testB + sizeof(int));
    double z1 = *(double*)((char*)&testB + sizeof(int) + sizeof(int));
    int k1 = *(int*)((char*)&testB + sizeof(int) + sizeof(int)+sizeof(double));
    cout << "-------TEST B----" << endl;
    testB.show();
    cout << "外部通过内存地址访问类的private变量:" << endl << x1 << "-" << y1 << "-" << z1 <<"-"<<k1 << endl;
    return 0;
}

运行结果:
运行结果.png

全栈前端开发工程师

15 声望
3 粉丝
0 条评论
推荐阅读
快速递归删除当前目录下所有命名为xxx的文件夹
有时候想要删除某个目录下所有命名为xxx的文件夹,一个个手动去删除,非常辛苦,那么可以使用这个进行自动删除,一个典型例子就是我需要拷贝or删除一个存放了很多前端工程化项目的目录,因为它每个项目都有node_mod...

点墨阅读 111

程序员适合创业吗?
大家好,我是良许。从去年 12 月开始,我已经在视频号、抖音等主流视频平台上连续更新视频到现在,并得到了不错的评价。每个视频都花了很多时间精力用心制作,欢迎大家关注哦~考虑到有些小伙伴没有看过我的视频,...

良许3阅读 1.3k

比cat更好用的命令!
但 cat 命令两个很重大的缺陷:1. 不能语法高亮输出;2. 文本太长的话无法翻页输出。正是这两个不足,使得 cat 只能用来查看行数不多的小文件。

良许2阅读 671

DBoS 系统说明
程序员TianSong以单片机开发入门,后续又做了 Qt 相关工作,有时间后开始进行 linux 相关的学习,恰巧在二一年十一月份,百问网的韦东山老师进行了三个月的 linux 驱动直播,于是有了开发 DBoS 的念头。

TianSong1阅读 1.2k

【Qt】简单桌面
[链接]简介简单桌面是一款小巧便捷的桌面背景管理软件。由编程爱好者个人开发,不收集使用者个人信息、不连接网络、不弹窗。下载功能支持单静态图片及多静态图片轮播(轮播时间可设置)支持GIF动画背景支持视频背...

TianSong3阅读 2.2k

良许翻天覆地的2022年
大家好,我是良许,新年快乐呀~在我女室友坚持不懈的努力之下,2022年的最后一天我终于被她传染了,阳了~此时的我,正顶着37多度的低烧写下这篇年终总结。2022年,对于大多数人而言,封控是主旋律——不停地核酸,...

良许2阅读 769评论 1

一个Bug让人类科技倒退几十年?
大家好,我是良许。前几天在直播的时候,问了直播间的小伙伴有没人知道「千年虫」这种神奇的「生物」的,居然没有一人能够答得上来的。所以,今天就跟大家科普一下这个人类历史上最大的 Bug 。1. 全世界的恐慌一...

良许阅读 1.4k

全栈前端开发工程师

15 声望
3 粉丝
宣传栏