Почему закрытые переменные класса доступны из объекта в классе? - PullRequest
0 голосов
/ 06 июня 2019

Допустим, у нас есть класс с одной переменной 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;
    }
};

Что странно для меня, так эточто параметр b в методе max имеет доступ к переменной private Number.Однако в функции main у нас нет доступа к параметру Number (как и ожидалось, поскольку он объявлен private)

int main()
{
    A a;

    a.Number = 0; // ERROR

    return 0;
}

Поэтому мой вопрос заключается в том, почему функция в классе имеетдоступ к переменной Number, когда она объявлена ​​private.

Ответы [ 2 ]

4 голосов
/ 06 июня 2019

Это просто правило, вот и все.

Он предназначен для упрощения написания функций-членов, особенно таких, как операторы присваивания, конструкторы копирования и перегруженные операторы. Если вы не можете получить доступ к членам «другого» объекта напрямую, вам понадобится множество friend объявлений или некрасивых «получателей»; последние, как правило, предлагают чуть больше, чем обход инкапсуляции.

Возможно, способ, которым вы предлагаете, мог бы быть по умолчанию, и для ввода частных и защищенных членов и функций могло потребоваться объявление

friend class;

Но C ++ не был спроектирован таким образом, и это предложение теперь станет ужасным прорывом. Что-то, над чем можно размышлять, чтобы восстановить ожидаемое поведение, может быть декларацией

friend class = delete;

что, насколько я могу судить, не будет серьезным изменением. Почему бы не предложить что-то в этой форме Комитету ISO C ++?

3 голосов
/ 06 июня 2019

Основная идея инкапсуляции заключается в том, чтобы скрыть внутреннее содержимое класса от внешних классов.

Если учесть, что написанная вами функция является внутренней по отношению к классу A, то имеет смыслфункция, чтобы знать о внутренних элементах A - независимо от контекста.

...