Возможный дубликат:
Класс Data Encapsulation (приватные данные) при перегрузке операторов
Пожалуйста, посмотрите на этот пример.
class myClass {
int a;
public :
myClass () {
this->a = 0;
}
myClass(int val) {
this->a = val;
}
void add(myClass &obj2) {
cout << "Result = " << this->a + obj2.a;
obj2.a = 0;
}
void show() {
cout << "a = " << this->a;
}
};
int main() {
myClass obj1(10), obj2(20);
obj2.show(); //prints 20.
obj1.add(obj2);
obj2.show(); //prints 0.
return 0;
}
В функции add () я могу получить доступ к значению приватного члена obj2, когда я фактически вызвал add () в контексте obj1. Разве это не нарушение инкапсуляции?
Сначала я думал, что компилятор выдаст мне ошибку, но это не так.
Нет.
Инкапсуляция работает на учебный класс уровень, а не на уровне экземпляра.
Вы можете получить доступ к закрытым членам любого экземпляра вашего класса.
Вы даже можете получить доступ к закрытым членам, определенным вашим классом, посредством ссылки на класс, производный от вашего класса.
Это не является нарушением инкапсуляции, поскольку вы обращаетесь к переменной-члену в методе, оба из которых принадлежат одному и тому же классу. Если бы obj2 был ссылкой на другой класс, например, yourClass, то это было бы нарушением, так как вы обращались к закрытому члену другого класса.