使用成员变量的偏移量访问结构体的私有成员



我正在阅读有关结构体和结构体填充的内容,并编写了这段代码。它使用a的地址偏移量编辑结构体的私有成员。这是否意味着您可以使用某人创建的类并提取/更改私有变量和函数?

#include <iostream>
typedef struct x {
    int a; 
private:
    int b;
public:
//Init
    x(int a, int b) : a(a) , b(b){}
    void print(){
        //Print values
        std::cout << a << " " << b << std::endl;
    }
} x;
int main()
{
    struct x s(10,20) ;
    int *p = (int *)(((char*)&s)+4); //4 Byte offset from a (a is at base)
    s.print();
    (*p) +=1;
    s.print();
    //Stops terminal closing
    int junk;
    std::cin >> junk;
    return 1;
}

c++的private是为抽象数据类型提供封装机制的。不是用来防止人们写不好的代码,如果他们真的的话。

这是否意味着你可以拿一个别人做的类和提取/更改私有变量和函数?

c++标准对这类问题没有要求。具体来说,对struct内部对象的大小没有要求。int的大小由实现定义

这可能是个坏主意,而且很可能是一种设计味道。

最新更新