Доступ к закрытой переменной класса в методе класса C++
Я пытаюсь понять, почему объект одного и того же класса может получить доступ к закрытому члену друг друга. На самом деле я знаю, что
Модификаторы доступа работают на уровне класса, а не на уровне объекта.
Отсюда Но я не понимаю причин этого. Я могу только предположить, что это связано с автоматической генерацией конструктора копирования и оператора копирования (который, очевидно, должен иметь доступ к личным данным, чтобы копировать его), но я не уверен. На самом деле это выглядит странно, что любой другой экземпляр одного класса может изменять частные переменные друг друга, например:
#include <iostream>
class A{
int c;
public:
A():c(1){}
void f(A & a){
a.c = 2;
}
int getC(){return c;}
};
int main()
{
A a1;
A a2;
a1.f(a2);
std::cout << "A1 c " << a1.getC() << std::endl;
std::cout << "A2 c " << a2.getC() << std::endl;
return 0;
}
a1 изменит a2.c и вывод будет
A1 c 1
A2 c 2
Благодарю.
2 ответа
Вы можете легко обойти такие средства защиты на уровне объектов, поэтому я сомневаюсь, что они того стоят. То есть заменить
void f(A &a) {
a.c = 2;
}
с
void f(A &a) {
a.update_c(2);
}
void update_c(int val) {
c = val;
}
Модификаторы доступа работают на уровне класса, а не на уровне объекта.
Причина этого в том, что компилятор фактически не знает ни о каких конкретных экземплярах объектов. Во время компиляции компилятор знает только структуру класса, которая будет использоваться, а не конкретные экземпляры этой структуры класса в памяти во время выполнения.
Публичный / частный / защищенный контроль доступа - это функция, которая помогает архитекторам определять, как их код используется другими программистами. Поскольку это только парадигма кодирования, она практически не влияет на код времени выполнения. Код, сгенерированный компилятором, не имеет ничего общего с этими элементами управления доступом.
Короче говоря, причина, по которой эта функция работает таким образом, заключается в том, что она предназначена только для помощи архитектору программного обеспечения.