【问题标题】:Why are private variables of a class accessible from an object in the class?为什么可以从类中的对象访问类的私有变量?
【发布时间】:2019-06-06 07:19:54
【问题描述】:

假设我们有一个类,它有一个 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;
}

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

【问题讨论】:

  • 这就是 private 的用途。外部无权访问,内部有
  • 在面向对象的语言中,对象可以访问同一类的其他对象的私有成员是相当普遍的
  • 您的问题从有关变量范围的内容开始。私有变量不是作用域变量。另外,请详细说明您看到的问题。
  • 因为否则私有变量将毫无意义。

标签: c++ class scope


【解决方案1】:

这只是规则,仅此而已。

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

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

friend class;

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

friend class = delete;

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

【讨论】:

    【解决方案2】:

    封装背后的主要思想是对外部类隐藏类的内部。

    当您认为您正在编写的函数是 A 类的内部函数时,函数了解 A 的内部结构是有意义的 - 无论上下文如何。

    【讨论】:

    • 是的,这是有道理的。我觉得这很奇怪,因为我曾经认为对象无法访问类的私有成员,无论你在哪里使用它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2011-10-18
    • 1970-01-01
    • 2016-11-27
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多