Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
SlavaSokolov
Заблокирован
#1

Возможно автор - дурак, но всё же. В чём суть private данных - C++

17.06.2017, 22:44. Просмотров 222. Ответов 10
Метки нет (Все метки)

Всем привет. Потихоньку учу c++ и стараюсь понимать все аспекты и только после этого переходить к следующей информации. Вопрос вот в чём. Зачем классам private данные? Зачем их защищать, если пользователь получит доступ только к той информации, которая используется?
Допустим у нас есть класс, который описывает дробь.
C++
1
2
3
4
5
6
7
8
class Fraction {
 
public:
    Fraction(int numerator, int denominator);
    void print();
        void black();
    int numerator, denominator;
};
В чём смысл защищать функцию или данные??? Допустим я напишу следующий код, который будет использовать данный класс.

C++
1
2
3
4
5
int main() {
 
    Fraction fraction(1, 2);
    fraction.print();
}
Как пользователь может получить доступ к данным, которые хранятся в numerator and denominator, если я сам не определю функции, которые будут предоставлять эти данные?

Я похоже потерял логическую связь с началом сообщения))), но надеюсь кто-нибудь сможет уловить суть.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2017, 22:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возможно автор - дурак, но всё же. В чём суть private данных (C++):

В чём суть оператора for(;;) - C++
в чём суть оператора for(;;) как он работает?

Привести примеры использования и объяснить, в чём суть оператора ^= - C++
Объясните пожалуйста, в чём суть оператора присваивания ^= в C++. Если можно, с примерами.

Не пойму ,в чём ошибка . Всё компилируется - C++
Я создал функцию поиска по заданном ключу , ключ вводится с клавиатуры . int Poisk(int *arr,int size,int key) { for(int...

В чём суть сборки? - Домашний компьютер
Здравствуйте. Я верю, что тут действительно есть знатоки компьютерного железа и я обращаюсь к вам. Я сам как бы начинающий IT-шник и учусь...

В чём заключается суть интерфейсов? - C#
Здравствуйте. Объясните, пожалуйста, в чем заключается смысл интерфейса, потому что так как понимаю я, то я не вижу в нем смысла. На...

Dota 2 Dark Moon: в чём суть? - MMO игры
Форумчане. Я только проснулся после НГ... Что за дарк мун в доте? Убивать крипов и получать очки, а потом выбивать сеты из рулетки?...

10
mskoromets
6 / 6 / 2
Регистрация: 29.12.2016
Сообщений: 128
Завершенные тесты: 2
17.06.2017, 23:25 #2
Добрый вечер. Опишу вкратце. Приватные данные это так сказать данные реализации, которые пользователю класса знать не обязательно. Также это защита от случайного изменения определённых данных класса. В качестве примера приведу класс Date, являющийся представлением определённой даты:
C++
1
Date x(25, 7, 2011) // объявления и инициализация переменной класса Date
При попытке инициализации переменной неверными данными выдаётся сообщение об ошибке (если таковое предусмотрено разработчиком класса)
Три эти переменные записываются в ПРИВАТНЫЕ переменные класса:
C++
1
2
3
4
5
6
7
8
class Date
{
// по умолчанию приватный сектор класса
    int day;     // (становится равной 25)
    int month; // (становится равной 7)
    int year;    // (становится равной 2011)
// дальнейшая реализация класса . . .
}
Но если бы эти данные не записывались в приватные переменные, то возможен был быть такой поворот событий:
C++
1
x.day = 32;
Очевидно, что нет такого месяца, в котором есть 32 дня, но программной точки зрения ошибки не было совершено. Ну а если уж мы всё таки хотим иметь возможность изменять приватные члены класса, то нам необходимо создать функцию в общедоступном (public) "секторе" класса и там уже предусмотреть данную возможность (заодно и проводя проверку новых данных).

Возможно, я выразил свои мысли не совсем корректно с точки зрения терминологии, но зато на понятном языке
0
TRam_
зомбяк
493 / 499 / 136
Регистрация: 14.05.2017
Сообщений: 1,714
17.06.2017, 23:26 #3
SlavaSokolov, суть в том, чтобы самому описать ограниченное число способов, как с этими данными поступать. Чтобы не "кто что захочет то и делает", а чтобы что-то можно было, а что-то нельзя. Например нужно, чтобы можно было задать начальные numerator, denominator, а потом их удалить только одновременно со всем объектом, без возможности изменения. За исключением например объявленной внутри класса функции

C++
1
2
3
4
5
void Fraction::incrimentator()
{
   numerator++;
   denominator++;
}
В результате у нас эти переменные смогут пользователями данного класса меняться только синхронно.

Конечно это никак не 100% гарантия того, что никто не сможет поменять эти переменные независимо, но как средство против невнимательности - в самый раз.

Кроме того, со временем, например, может понадобиться не только чтоб incrimentator() инкрементировал переменные, но и, допустим, писал это в лог-файл. Если пользователи данного класса изменяли переменные самостоятельно, то ничего такого сделать бы не удалось. А так - добавить в функцию incrimentator() соответствующий вызов - и всё, при любых инкриментациях у нас будет вывод в лог сообщения об этом.
0
nd2
2482 / 2071 / 723
Регистрация: 29.01.2016
Сообщений: 6,807
17.06.2017, 23:37 #4
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
Как пользователь может получить доступ к данным, которые хранятся в numerator and denominator, если я сам не определю функции, которые будут предоставлять эти данные?
Если данные в public разделе, то доступ к ним можно получить и без функций:
C++
1
2
3
    Fraction fraction(1, 2);
    fraction.print();
    fraction.denominator = 0;
1
SlavaSokolov
Заблокирован
18.06.2017, 00:17  [ТС] #5
Цитата Сообщение от nd2 Посмотреть сообщение
Если данные в public разделе, то доступ к ним можно получить и без функций:
Да, можно, но как юзер программы сделает во время её исполнение вызов команды fraction.denominator?
Или есть ещё какой-то способ получить доступ к открытым данным класса? И если мы скрываем функции или данные, то пользователь может покопаться в исходниках кода?
Хотя исходный код программ скрывается(закрывается).
0
Voll deMaar
3 / 3 / 0
Регистрация: 22.08.2016
Сообщений: 32
18.06.2017, 00:26 #6
SlavaSokolov, вот именно - как? Либо при помощи метода класса, либо при помощи внешней функции, но зачем вообще тогда городить класс?

Добавлено через 3 минуты
То, что написали вот эти - TRam_, mskoromets - джентльмены, тебе вполне ясно? У меня тут ещё аналогия в голове созрела, могу поделиться, если вдруг ещё нужно
1
mskoromets
6 / 6 / 2
Регистрация: 29.12.2016
Сообщений: 128
Завершенные тесты: 2
18.06.2017, 00:38 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
SlavaSokolov, в 90% программистов работают в команде над общим проектом. Более того, членами команды не всегда являются в принципе программисты. Допустим, 2-ум членам команды (скажем, программисту и биологу) поручили разработать класс, каким-то образом связанный с биологией. Программист интерпретирует в код всю информацию, полученную от биолога. Допустим, они создали тот класс. Но над проектом работает целая команда (скажем, 25 человек), и было бы не очень рационально объяснять тонкости и принципы биологических процессов каждому, поэтому эту задачу предварительно поручили одному кодеру. Класс, который они (программист и биолог) разработали теперь будет использовать вся команда, при том имея общие понятия о классе, они могут идти дальше. Команда разработчиков теперь сможет иметь дело с членами публичными членами данных, и в то же время они не смогут каким-то образом навредить данным (в силу своего полного незнания деталей реализации). Если бы все данные класса были публичные (public), то кто-то рано или поздно бы изменил какие-нибудь данные и тем самым нарушил бы какой-нибудь фундаментальный закон биологии даже не подозревая об этом.

Цитата Сообщение от SlavaSokolov Посмотреть сообщение
Или есть ещё какой-то способ получить доступ к открытым данным класса? И если мы скрываем функции или данные, то пользователь может покопаться в исходниках кода?
Имеется ввиду не пользователь самой программы, а пользователь класса, то-есть тот кто, возможно, совместно с вами разрабатывает проект.
1
nd2
2482 / 2071 / 723
Регистрация: 29.01.2016
Сообщений: 6,807
18.06.2017, 00:43 #8
Цитата Сообщение от SlavaSokolov Посмотреть сообщение
Да, можно, но как юзер программы сделает во время её исполнение вызов команды fraction.denominator?
Разговор идёт о пользователях твоего класса, а не о пользователях собранной программы. От пользователя собранной программы и скрывать ничего не нужно, он не имеет доступа к исходному коду.
0
TRam_
зомбяк
493 / 499 / 136
Регистрация: 14.05.2017
Сообщений: 1,714
18.06.2017, 00:56 #9
SlavaSokolov, и по поводу "других пользователей" - это уже тогда, когда будешь писать собственные библиотеки, которые другим программистам было бы легко использовать - тогда придётся к этим вопросам уделять особое внимание, чтобы "даже самый непонимающий сути твоих кодов программист не смог бы нарушить логику выполнения твоего кода".

Но конечно речь не о конечном пользователе программ - потому что вытянуть из скомпилированной программы объявления классов практически невозможно (максимум что иногда можно - это расконвертировать машинный код в код на Си (и то мало какие программы этому поддадутся), а так обычно возможно его только дизассемблировать, т.е. смотреть непосредственно инструкции процессору в доступном для понимания виде). Речь именно о программистах, которые используют или будут использовать твой код. И не только о каких-то абстрактных программистах, но и о тебе самом, если старым кодом тебе придётся воспользоваться через много лет, за которые основательно забудешь что этот код делал и как он работает.
1
SlavaSokolov
Заблокирован
18.06.2017, 01:27  [ТС] #10
Цитата Сообщение от mskoromets Посмотреть сообщение
SlavaSokolov, в 90% программистов работают в команде над общим проектом. Более того, членами команды не всегда являются в принципе программисты. Допустим, 2-ум членам команды (скажем, программисту и биологу) поручили разработать класс, каким-то образом связанный с биологией. Программист интерпретирует в код всю информацию, полученную от биолога. Допустим, они создали тот класс. Но над проектом работает целая команда (скажем, 25 человек), и было бы не очень рационально объяснять тонкости и принципы биологических процессов каждому, поэтому эту задачу предварительно поручили одному кодеру. Класс, который они (программист и биолог) разработали теперь будет использовать вся команда, при том имея общие понятия о классе, они могут идти дальше. Команда разработчиков теперь сможет иметь дело с членами публичными членами данных, и в то же время они не смогут каким-то образом навредить данным (в силу своего полного незнания деталей реализации). Если бы все данные класса были публичные (public), то кто-то рано или поздно бы изменил какие-нибудь данные и тем самым нарушил бы какой-нибудь фундаментальный закон биологии даже не подозревая об этом.
Огромное спасибо! Пример с программистами, которые нули в биологии идеально зашёл).
Мда... Я бы долго пытался понять это, учитывая, что в моих программах по 3-4 класса максимум))). В которых бонусом по 5 функций не более))).
0
mskoromets
6 / 6 / 2
Регистрация: 29.12.2016
Сообщений: 128
Завершенные тесты: 2
18.06.2017, 01:35 #11
SlavaSokolov, не за что
0
18.06.2017, 01:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2017, 01:35
Привет! Вот еще темы с ответами:

В чём суть ошибки? Warning: Parameter 3 to showBlogSection() expected to be a reference, value given in on line 100 - PHP
Здравствуйте. Не могу понять в чем суть ошибки Warning: Parameter 3 to showBlogSection() expected to be a reference, value given in on line...

Разобрать пример из книги. Возможно ли, что автор ошибся? - C#
Всем привет. Ребят, разбираюсь с указателями и в одной книге подозреваю, что в примере кода ошибка в объяснении. Подскажите, пожалуйста,...

private fields: возможно ли узнать их значение? - Java
С помощью java.lang.reflect смог докопаться до значений полей класса. Однако получается, что не до всех, а лишь до тех, которые в пределах...

В чём суть метода дихотомии и метода золотого сечения? - VBA
Исследовать функцию на экстремумы методом дихотомии и методом золотого сечения: F(x)=sin(x+1.4)-2.1*x*cos(2*x^2+0.5). Очень надо. Спасибо. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru