将指针传递给私有变量时出现意外行为

时间:2016-03-28 17:09:55

标签: c++

目前我正在使用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值。通常,如果我尝试访问此值,编译器将上升错误标志,表明这是私有变量。如果我将它作为值传递,或者将指针传递给我的类并尝试以这种方式访问​​它并不重要。

所以我的问题是 - 为什么会这样?是的,我知道我正在传递指向值的指针,但是这里也不应该有编译器上升标志吗?

2 个答案:

答案 0 :(得分:2)

privatepublic部分控制这些部分中声明的名称的可见性。他们无法控制数据的可见性。外部代码无法引用MyClass::dummy_data名称,因为它是私有的。如果该类选择以某种方式公开该变量的,甚至是地址,那么该类的选择以及任何代码都是访问其他大道(在这种情况下是指针)可以自由阅读。没有语言错误,因此编译器不会抱怨。

答案 1 :(得分:1)

这是有效的。

访问限制包含在成员的名称上,而不是成员本身。 (否则很多吸气剂都行不通!)

允许(通过成为成员函数)按名称访问该成员的函数已决定传递指向该对象的指针。如果您不希望发生这种情况,请不要这样做。

在一般情况下,编译器实际上不可能检测并阻止此代码,即使它应该是这样。