С частным модификатором, почему к объекту можно обращаться к другим объектам напрямую?
У меня есть следующий код:
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
?
Ответы
Ответ 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.