C++ 借助指针突破访问权限的限制,访问private、protected属性的成员变量(花拳绣腿)

#include <iostream>
using namespace std;

class A {
public:
    A(int a, int b, int c);
private:
    int m_a;
    int m_b;
    int m_c;
};
A::A(int a, int b, int c) : m_a(a), m_b(b), m_c(c) { }

int main() {
    A obj(10, 20, 30);
    int a1 = *(int*)&obj;
    int b = *(int*)((int)&obj + sizeof(int));

    A* p = new A(40, 50, 60);
    int a2 = *(int*)p;
    int c = *(int*)((int)p + sizeof(int) * 2);

    cout << "a1=" << a1 << ", a2=" << a2 << ", b=" << b << ", c=" << c << endl;

    return 0;
}

1.直接使用obj访问m_b是访问不到的。不过通过指针可以访问
int b = p->m_b; ==>等价==> int b = *(int*)( (int)p + sizeof(int) );
2.前面我们说 C++ 的成员访问权限仅仅是语法层面上的,是指访问权限仅对取成员运算符.和->起作用,而无法防止直接通过指针来访问。你可以认为这是指针的强大,也可以认为是 C++ 语言设计的瑕疵。使用指针不是为了访问到 private、protected 属性的成员变量,这种“花拳绣腿”没有什么现实的意义,本节主要是让大家明白编译器内部的工作原理,以及指针的灵活运用。

posted @ 2022-03-30 15:17  Smah  阅读(560)  评论(0编辑  收藏  举报