我们可以通过像这样的指针访问该类之外的类的私有数据成员

时间:2016-03-25 18:47:39

标签: c++

请考虑以下代码:

class A {
    int y;
    int z;
  public:
    A(){
        int b = 9;
    }
    ~A(){
        cout << "In destructor\n";
    }
    int getY(){
        return Y;
    }
};
void main(){
    A a_obj;
    int *y = (int *)&a_obj;
    // Modifying the private content
    *y = 8;
    int h = a_obj.getY();
    cout << h << endl;         //Display 8.
}

现在我们可以访问类的私有数据成员了。这是对的吗? 通过这个,我们正在做一件不应该做的事情。 我们可以通过任何方式阻止这种情况吗?

1 个答案:

答案 0 :(得分:1)

老兄,“大不了”。我确信在宇宙的某个地方,有一种情况会迫使你不得不这样做......

但如果我不得不这样做,我肯定会避免。答案是我认为显示价值“8”的瞬间行为。你能描述一下你的具体情况吗?也许我们可以看出它是否有意义或更好替代品可能存在吗?

访问限制按类操作,而不是按实例操作 - 类A方法(如果存在)可以访问类的任何实例的私有数据,

如果您尝试int *y= &a_obj.xint *y= &a_obj.z,编译器会给您一个错误,编译器会告诉您无法访问私有成员。

在您的代码中,您将cc的地址重新解释为指向int的指针。你用C风格的方式编写了它,C ++风格的方式应该是int* y = reinterpret_cast<int*>(&a_obj);。 reinterpret_cast始终警告您正在两个不相关的指针之间进行转换。在这种情况下,你必须确保你做得对。您必须知道底层内存(布局)。编译器不会阻止您这样做,因为这通常是需要的。

相关问题