为什么可以从类中的对象访问类的私有变量?

时间:2019-06-06 07:19:54

标签: c++ class scope

假设我们有一个带有单个private变量的类和一个max方法,该方法采用与该类相同类型的单个参数:

class A
{
private:
    int Number;

public:
    A() : Number(0) {}
    A(int val) : Number(val) {}

    int max(A b)
    {
        if( Number > b.Number )
            return Number;

        return b.Number;
    }
};

令我感到奇怪的是,max方法中的参数b可以访问private变量Number。但是,在main函数中,我们无权访问参数Number(因为被声明为private,这是预期的)

int main()
{
    A a;

    a.Number = 0; // ERROR

    return 0;
}

所以我的问题是,为什么类中的函数在声明为Number时才能访问变量private

2 个答案:

答案 0 :(得分:4)

仅此而已。

它的设计使成员函数(尤其是赋值运算符,复制构造函数和重载运算符)更易于编写。如果您无法直接访问“其他”对象的成员,那么您将需要大量的friend声明或丑陋的“获取器”;后者往往只提供绕过封装的功能。

也许您建议的方式可能是默认方式,而引入私有和受保护的成员和函数可能需要声明

friend class;

但是C ++并不是以这种方式设计的,该建议现在将是一个可怕的突破性变化。虽然可以恢复您的预期行为,但值得思考的是

friend class = delete;

据我所知,不是是一个重大变化。为什么不向ISO C ++委员会提出这种形式的建议呢?

答案 1 :(得分:3)

封装背后的原理是从外部类中隐藏类的内部。

当您认为所编写的函数在类A的内部时,对于函数而言,了解A的内部是有意义的-无论上下文如何。