Небольшой уточняющий вопрос по классам C++.
Допустим, в классе есть метод. В этот метод передается параметр типа того же самого класса, в котором объявлен метод.
class A
{
...
public:
void Test(A& obj);
...
};
Методом проб и ошибок было установлено, что я могу спокойно изменять приватные члены класса, переданному в Test внутри метода. Я не понял, и где же тогда эта ваша инкапсуляция? Что-то в учебниках ответа не нашел, по каким тегам гуглить не знаю. Заранее спасибо.
Попробую объяснить доступными средствами что такое инкапсуляция.
Берем обычные механические часы - бьюсь в заклад, что 99% людей слабо представляют внутреннее устройство часового механизма - ну да там шестеренки, пружинки, маятник и проч. Но ведь все пользуются этими часами - индусы, китайцы, девочки, мальчики, пенсионеры, бандиты, президенты - в общем все. И все почему? Да потому что часы наружу выставляют 3-4 метода для работы с ними инкапсулируя в этих методах все свои пружинки, шестеренки и проч. винтики. Какие же это методы?
То же самое и с классами - инкапсуляция не означает полное скрытие данных, а это способ предотвращения бесконтрольного доступа.
Если вернуться к аналогии с часами, то инкапсуляция не есть священная корова - всегда найдется плохой мальчик, который вскроет заднюю крышку часиков и начнет туда-сюда крутить шестеренки.
Инкапсуляция - это способ предотвращения бесконтрольного доступа к внутренним (=приватным) элементам объекта извне. Использование методов класса для работы с внутренними структурами - это и есть инкапсуляция, поскольку это есть контролируемый доступ к внутреннему пространству объекта: пользователь имеет доступ только к тому, что позволит автор, и только так, как позволит автор.
Кстати, в языке Scala поля класса можно делать доступными только для объекта-владельца, похоже это то, что хочет ТС.
class Foo {
private[this] var privateVar = 1
def changePrivateVar() {
privateVar = 2 // OK
}
def bar(foo: Foo) {
foo.privateVar = 2 // Не скомпилируется
}
}
Насколько мне известно, в C++ нет возможности подобным образом ограничить доступ к полям класса.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники