Подтвердить что ты не робот

С частным модификатором, почему к объекту можно обращаться к другим объектам напрямую?

У меня есть следующий код:

class A 
{
private:
    int x;
public:
    A()
    {
        x = 90;
    }
    A(A a1, A a2)
    {
        a1.x = 10;
        a2.x = 20;
    }
    int getX()
    {
        return this->x;
    }
};

Я знаю, что код может быть странным, но я не понимаю, почему a1 и a2 могут обращаться к частному элементу данных x?

4b9b3361

Ответ 1

Хороший вопрос. Дело в том, что защита на С++ - это уровень класса, а не уровень объекта. Таким образом, метод, вызываемый на одном объекте, может обращаться к закрытым членам любого другого экземпляра того же класса.

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

Еще одна мысль о реальном "почему?". Подумайте, как вы пишете почти любой конструктор копий; вам нужен доступ к исходной базовой структуре данных, а не к представленному интерфейсу.

Ответ 2

Любая функция-член класса, а также конструкторы могут получить доступ к личным данным. Это частные члены объекта экземпляра, вызываемого методом, или частные члены других экземпляров.

В этом случае это конструктор и другие экземпляры (а именно a1, a2).

Ответ 3

Короткий ответ. В методах члена class A доступны все члены (объект/указатель и член static) class A.

Ответ 4

A(A a1, A a2)
{
    a1.x = 10;
    a2.x = 20;
}

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

Теперь как конструктор, так и аргументы a1,a2 относятся к классу. Таким образом, он может получить доступ ко всем членам, независимо от уровня доступа. Это тоже будет работать в конструкторе -

this->x = a1.x; // Notice that "this" members can be accessed too.
                // How ever both the member variables are different and are part of
                // different objects.