目前我正在使用GUI设计工作很多,我使用了很多回调方法。通常,这些方法看起来像:static void* Foo(void* data)
。感谢他们,我发现只要传递指针就可以访问私有变量而没有任何问题。
假设我有这样的课程:
class MyClass
{
public:
MyClass();
static void* Foo(void* data);
private:
int dummy_data = 3;
}
和方法:
MyClass::MyClass()
{
Foo((void*)&dummy_data);
}
void* MyClass::Foo(void* data)
{
received_value = (int*)data;
printf("Private value: %d\n",received_value);
}
我可以阅读dumy_data
值。通常,如果我尝试访问此值,编译器将上升错误标志,表明这是私有变量。如果我将它作为值传递,或者将指针传递给我的类并尝试以这种方式访问它并不重要。
所以我的问题是 - 为什么会这样?是的,我知道我正在传递指向值的指针,但是这里也不应该有编译器上升标志吗?
答案 0 :(得分:2)
private
和public
部分控制这些部分中声明的名称的可见性。他们无法控制数据的可见性。外部代码无法引用MyClass::dummy_data
名称,因为它是私有的。如果该类选择以某种方式公开该变量的值,甚至是地址,那么该类的选择以及任何代码都是访问其他大道(在这种情况下是指针)可以自由阅读。没有语言错误,因此编译器不会抱怨。
答案 1 :(得分:1)
这是有效的。
访问限制包含在成员的名称上,而不是成员本身。 (否则很多吸气剂都行不通!)
允许(通过成为成员函数)按名称访问该成员的函数已决定传递指向该对象的指针。如果您不希望发生这种情况,请不要这样做。
在一般情况下,编译器实际上不可能检测并阻止此代码,即使它应该是这样。