请考虑以下代码:
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.
}
现在我们可以访问类的私有数据成员了。这是对的吗? 通过这个,我们正在做一件不应该做的事情。 我们可以通过任何方式阻止这种情况吗?
答案 0 :(得分:1)
老兄,“大不了”。我确信在宇宙的某个地方,有一种情况会迫使你不得不这样做......
但如果我不得不这样做,我肯定会避免。答案是我认为显示价值“8”的瞬间行为。你能描述一下你的具体情况吗?也许我们可以看出它是否有意义或更好替代品可能存在吗?
访问限制按类操作,而不是按实例操作 - 类A方法(如果存在)可以访问类的任何实例的私有数据,
如果您尝试int *y= &a_obj.x
或int *y= &a_obj.z
,编译器会给您一个错误,编译器会告诉您无法访问私有成员。
在您的代码中,您将cc的地址重新解释为指向int的指针。你用C风格的方式编写了它,C ++风格的方式应该是int* y = reinterpret_cast<int*>(&a_obj);
。 reinterpret_cast始终警告您正在两个不相关的指针之间进行转换。在这种情况下,你必须确保你做得对。您必须知道底层内存(布局)。编译器不会阻止您这样做,因为这通常是需要的。