Нарушение инкапсуляции?

Возможный дубликат:
Класс 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. Разве это не нарушение инкапсуляции?

Сначала я думал, что компилятор выдаст мне ошибку, но это не так.

5

Решение

Нет.

Инкапсуляция работает на учебный класс уровень, а не на уровне экземпляра.

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

7

Другие решения

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

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector