首页 > 解决方案 > 为什么可以从类中的对象访问类的私有变量?

问题描述

假设我们有一个具有单个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;
    }
};

对我来说奇怪的是bmax 方法中的参数可以访问private变量Number。但是在main函数中我们无法访问参数Number(正如预期的那样,因为它被声明了private

int main()
{
    A a;

    a.Number = 0; // ERROR

    return 0;
}

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

标签: c++classscope

解决方案


这只是规则,仅此而已。

它旨在使成员函数,尤其是赋值运算符、复制构造函数和重载运算符等函数更易于编写。如果您不能直接访问“其他”对象的成员,那么您将需要过多的friend声明或丑陋的“getter”;后者往往提供的只是对封装的规避。

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

friend class;

但是 C++ 并不是这样设计的,这个提议现在将是一个可怕的突破性变化。尽管要恢复您的预期行为,但需要考虑的事情可能是声明

friend class = delete;

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


推荐阅读