LINUX.ORG.RU

C++ private поля

 


0

1

здрасте здрасте люди добрые

скажите пожалуйста посредством чего достигается инкапсуляция?

class exemple
{
int a=456; // как достигается то что поле'a' не видно полю 'b' ? 
public:
int b=789;
friend func(exemple obj); // как работает дружественная функция?
как она видит поля  private? заслуга компилятора в этом? 
как это происходит? думаю что многие скажут, что вопрос непонятен им.  Для них повторю еще раз. 

пожалуйста объясните как дружественная функция видит приватные поля ? объяснение преподов об окошечках меня не устроило. Тем более что вы недавно сами критиковали подобные глупые способы объяснения, находя их дурацкими. Так объясните пожалуйста правильно. Покажите как надо.

Еще раз:  каким образом дружественная функция видит приватные поля.  Почему поля класса из private и public не видны друг другу? они расположены в одной обрасти памяти? 

};

Поле бэ вообще ничего не видит.

За ограничением доступа к приватным полям следит компилятор, но его можно обмануть.

Инкапсуляция тут вообще не причем.

Ах да,я же у Вас в игноре… Ну и замечательно.

AntonI ()

Достигается тем, что компилятор знает, что поле приватное, и, при попытке к нему обратиться, выдаст ошибку. Всё. Точно то же самое относится к френдам.

Что значит «в одной области памяти»? Память, она вся — большая область. По крайней мере, с точки зрения C++.

Постарайся, пожалуйста, не запихивать основной текст в пример кода.

Miguel ★★★★★ ()

как достигается то что поле ‘a’ не видно полю ‘b’

это фраза бессмысленна. Члены классы могут быть видимы или невидимы функциям, но не полям. Да что вообще могло бы значить видимость одного поля для другого?

каким образом дружественная функция видит приватные поля.

По правилам языка она их видит. А правила проверяются компилятором. Точнее видимость определяется для имён, она не означает, что по указателю нельзя прочитать память, в которой храниться private поле класса.

они расположены в одной обрасти памяти?

что ты понимаешь под областью памяти? Можно ли имея указатель на одно поле, используя арифметику указателей, поменять другое (и с другой видимостью) - да можно. Является ли такая программа корректной - нет, она содержит неопределённое поведение.

Begemoth ★★★★★ ()
Ответ на: комментарий от AntonI

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

anonymous ()

думаю что многие скажут, что вопрос непонятен им

Понятен, но в таком виде он не имеет смысла.

Друзья видят чужие приватные срамные части и члены чужих классов. Это часть системы аксиом языка си++. Видят и все. «Как» - это уже к конкретным реализациям.

как дружественная функция видит приватные поля

В биноклю.

anonymous ()
Ответ на: комментарий от Begemoth

Можно ли имея указатель на одно поле, используя арифметику указателей, поменять другое (и с другой видимостью) - да можно. Является ли такая программа корректной - нет, она содержит неопределённое поведение.

Что такое «можно, но содержит неопределённое поведение»?

anonymous ()

Экземпляр твоего класса устроен абсолютно точно так же, как сишная структура

struct {
  int a;
  int b;
};

Все функции, получающие доступ к объекту (по ссылке, по указателю или по значению), получают по факту доступ ко всем его полям, они хранятся вместе в единой структуре. Модификаторы доступа public/protected/private «всего лишь» вызывают ошибки компиляции, когда обращение к полям осуществляется нарушает определенные правила

annulen ★★★★★ ()
Ответ на: комментарий от Begemoth

стой, не делай быстрых выводов и не спеши обвинять.

полями классам могут быть не только «переменные » типа int, как int a=123; столкнулся с тем, что поля из приватной зоны не видны полю из публичной и наоборот. инкапсуляция может достигаться , как в Си посредством statiс , отсюда и речь про память.

я спрашиваю посредством чего она достигается в С++.  Все просто.
Assembler ()

Приватные поля обычно полезны в тех случаях, если при их изменении
должны выполняться какие-либо функции или их изменение должно учитываться в иных объектах.

Если код пишите «для себя» и вы «не забывчивый», можете все поля использовать как public.

Владимир

anonymous ()

Ты путаешь инкапсуляцию и сокрытие данных. Инкапсуляция - это объединение данных и операций над данными.

Сокрытие данных - это предоставление к ним доступа только через определенный набор функций.

Определись, что тебе нужно.

LongLiveUbuntu ★★★★★ ()
Последнее исправление: LongLiveUbuntu (всего исправлений: 1)
Ответ на: комментарий от Assembler

столкнулся с тем, что поля из приватной зоны не видны полю из публичной и наоборот

Как именно ты с этим столкнулся? Как ты смог проверить, что поле действительно «не видит» поле ?

anonymous ()
Ответ на: комментарий от anonymous

Приватные поля обычно полезны в тех случаях, если при их изменении должны выполняться какие-либо функции или их изменение должно учитываться в иных объектах.

Ситуаций, когда поля полезно относить к private много больше.

Владимир

anonymous ()
Ответ на: комментарий от anonymous

Ситуаций, когда поля полезно относить к private много больше.

Но если будете «частить», то ждем треда «Много сеттером и геттеров».

https://ravesli.com/urok-115-inkapsulyatsiya-gettery-i-settery/#toc-2 Урок №115. Инкапсуляция, Геттеры и Сеттеры

Владимир

anonymous ()
Ответ на: комментарий от AntonI

Ничего страшного, скоро закончатся пересдачи и пойдут отчисления и ТС-а мы больше не увидим, как минимум, в течении года, т.к. он пойдёт учиться окопы копать.

peregrine ★★★★★ ()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

ТС-а мы больше не увидим, как минимум, в течении года, т.к. он пойдёт учиться окопы копать.

А может и не пойдёт, у него хоть как-то худо-бедно слова в некое подобие предложений иногда получается слеплять, в наше время в высших учебных заведениях и не такие кадры остаются до последнего

anonymous ()
Ответ на: комментарий от peregrine

Эти официальные пересдачи идут чуть ли не до конца семестра (в МГУ). На физтехе вообще главное до диплома все сдать… иногда мелькают люди которые год-два назад ушли в туман со напутственными словами вслед «как сделаете - приходите». Но это правда спецкурс.

AntonI ()
Ответ на: комментарий от LongLiveUbuntu

а разве инкапсуляция не подразумевает защиту данных путем их сокрытия от внешнего вмешательства? иногда дружественные функции и методы просто необходимы. поэтому немого просто взять их и выбросить. Но к вашим словам прислушаюсь.

Assembler ()
Ответ на: комментарий от LongLiveUbuntu

В C++ не существует никакой защиты доступа к приватным полям. Если очень нужно, то доступ можно получить многими способами, начиная от #define private public и заканчивая прямым доступом по нужным адресам.

Reset ★★★★★ ()
Ответ на: комментарий от LongLiveUbuntu

А где избавились? В C# или в Rust тоже можно добраться до приватных членов…

Вот пример: https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=a15ac5bab863dae1f1612c1146e22c9a

fsb4000 ★★★ ()
Последнее исправление: fsb4000 (всего исправлений: 1)