18+ 
Волгоградский форум - Главный форум Волгограда.   

  

Ответ
Волгоградский форум » Программы » Программирование »  С++ модификаторы доступа
Программирование - Средства разработки, СУБД, разработка, внедрение. WEB-технологии.
 
Опции темы Поиск в этой теме
Старый 12.10.2016, 13:44   #1
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
Question С++ модификаторы доступа

Суть такова:
на работе стали читать халявный курс по си++, препод из мфти, полезно, а я си как раз никогда не трогал, обходился, и решил что было бы полезно. Курс читается удаленно и медленно, на 2 года рассчитан, так я качнул приложение на андроиде и сам начал учить в свободное время. и дошел до места которое не втыкаю, пытался гуглить, но как-то так и не понял.
итак:

Public — доступ открыт всем, кто видит определение данного класса.
Private — доступ открыт самому классу (т.е. функциям-членам данного класса) и друзьям (friend) данного класса, как функциям, так и классам.
Protected — доступ открыт классам, производным от данного.

зачем оно нужно?
кодер пишет программу, выходит он скрывает определение класса от самого себя? или от других данных, но чтобы не давать модифицировать данные программисту достаточно не описывать способ их модификации в коде, разве не так?
расскажите на пальцах.
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 12.10.2016, 14:47   #2
pmb Меню пользователя pmb
Участник
Волгоград
Сообщений: 1779
gerodoth, вечная классика, когда-о за месяц по вечерам читалась на ура.

---------- Сообщение добавлено 12.10.2016 14:49 ----------

gerodoth, посмотри что такое инкапсуляция в ООП
pmb вне форума   Ответить с цитированием
Старый 12.10.2016, 16:11   #3
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
вроде смотрел, не понял, но может оно.
курс, зараза, на буржуйском, незнакомые слова пропускаю.
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 12.10.2016, 21:15   #4
Дмитрий Н Меню пользователя Дмитрий Н Мужской
Аватар для Дмитрий Н
Участник
World Wide Web
Сообщений: 363
Модификаторы доступа - это реализация инкапсуляции. Если, например, речь вести не в контексте одного разраба и программки из трёх с половиной классов, а в контексте команды разработчиков, работающей над большим проектом или библиотекой, причём сама разработка сильно растянута во времени и в команде есть текучка, то модификаторы доступа позволяют скрывать часть реализации бизнес логики класса от внешнего мира, тем самым недавая в будущем плохо разобравшемуся в коде новичку выстрелить себе в ногу.
Дмитрий Н вне форума   Ответить с цитированием
Старый 12.10.2016, 23:04   #5
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
я думал про такой вариант, но он вообще не на поверхности. это самый простой вариант?
опять же зачем скрывать, не знаю как где, но в той же 1с конфига с нуля с задействованием кучи народа продвигается без этой заморочки, достаточно не нанимать "программистов", стреляющих по своим. наверняка и не только в 1с, просто это мне знакомо. выглядит как фича, притянутая за уши.
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 13.10.2016, 07:39   #6
Прохожий Меню пользователя Прохожий Мужской
Участник
Волгоград
Сообщений: 4657
Во времена широкого распространения библиотек и фреймворков, другого способа обеспечить корректную работу и нет, чтобы пользователи не начали вызывать внутренние методы и косячить, нужно отдать им "большую красную кнопку", а остальное скрыть.

Это как в машине - ты заводишь автор поворотом ключа и никто не даёт тебе возможности отдельно включить бензонасос, активировать зажигание и подать напряжение на стартер на короткое время. А если бы давали, то 70% юзеров забывали бы выключать стартер. Поэтому его вызов и сделали приватным.
Прохожий вне форума   Ответить с цитированием
Старый 13.10.2016, 09:17   #7
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
примерно понятно, спасибо.

ну и раз уж мы тут все собрались, я не до конца понимаю смысл этих конструкций, вернее я их совсем не понимаю, хоть задачи решать и научился, опытным путем. как-то это пропустили в объяснении, уже 3 раза перечитал все что было про указатели, строки и char.
почему указателю символьного типа присваивается целая строка?
Миниатюры
Нажмите на изображение для увеличения
Название: Screenshot_2016-10-10-20-55-17.jpg
Просмотров: 43
Размер:	29.3 Кб
ID:	213679   Нажмите на изображение для увеличения
Название: Screenshot_2016-10-11-07-57-49.jpg
Просмотров: 33
Размер:	30.9 Кб
ID:	213680   Нажмите на изображение для увеличения
Название: Screenshot_2016-10-12-07-56-42.jpg
Просмотров: 25
Размер:	29.8 Кб
ID:	213681  
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
  
Старый 13.10.2016, 12:41   #8
Леханссон Меню пользователя Леханссон Мужской
Участник
Stalingrad
Сообщений: 778
Сообщение от gerodoth Посмотреть сообщение
почему указателю символьного типа присваивается целая строка?
На самом деле все константы типа "abcdef" храняться в специальной области памяти, которая инициалируется в момент запуска программы.
Этим оператором мы всего лишь присваем указателю адрес этой области памяти.
Леханссон вне форума   Ответить с цитированием
Старый 13.10.2016, 12:55   #9
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
примерно так я и понял, чего ж они это не написали, примеров не привели, а задачки выдают.
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 13.10.2016, 13:26   #10
Прохожий Меню пользователя Прохожий Мужской
Участник
Волгоград
Сообщений: 4657
а что делает оператор ++a в случае строки? Если бы символ - понятно
Прохожий вне форума   Ответить с цитированием
Старый 13.10.2016, 14:02   #11
Capitan Alex Меню пользователя Capitan Alex Мужской
Участник
Волгоград
Сообщений: 6973
Сообщение от gerodoth Посмотреть сообщение
ну и раз уж мы тут все собрались, я не до конца понимаю смысл этих конструкций, вернее я их совсем не понимаю, хоть задачи решать и научился, опытным путем. как-то это пропустили в объяснении, уже 3 раза перечитал все что было про указатели, строки и char.
почему указателю символьного типа присваивается целая строка?
А что конкретно не понятно в первом примере ?
__________________
Труднее всего объяснить очевидные вещи.
Capitan Alex вне форума   Ответить с цитированием
Старый 13.10.2016, 14:33   #12
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
ну как, рассказывали про типы, про то что переменной одного типа данные другого типа присвоить нельзя, а тут в задачках бац - символьному указателю и строку. задачки там рандомно генерятся, я думал пропустил что - перепроверил, не пропустил. почему символьному? почему он на начало строки указывает? как-то это все мутно без объяснения.
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 13.10.2016, 15:08   #13
Redrik Меню пользователя Redrik Мужской
Аватар для Redrik
Участник
Stalingrad
Сообщений: 14020
gerodoth, указатель " * " (звездочка) это, на самом деле число. Чаще всего ЛонгИнт (тоесть чаще всего это 64-биное число, но могут быть и варианты)
Короче, указатель это число. Это адрес нулевой ячейки памяти в которой располагается какой-нть текст (char).
А char - это тип указателя. Показывающий, что все, что идет начиная с адреса указателя - является чаром.
В этом смысле этот Ваш char *a; ++a; указывает на второй и далее байт строки "12345"
Т.е. cout << ++а; даст на выходе "2345"
Есть отличие между а++, и ++а.
В случае ++а - инкремент выполняется ДО начала вычислений всей строки (прединкремент)
А а++ - после - постинкремент


разберем Ваш первый пример

char * a = "12345"; // *а = "12345"
char * b = ++а; // в результате *а = "2345", *b = "2345" т.е. сначала инкрементируется переменная а, затем она присваивается указателю b. ВНИМАНИЕ! *а = "2345" и *b = "2345" это физически одни и те же данные. Если сделать а[3] = "8", то b станет равным "2348"
cout << * ++b; //выдаст на стандартный поток вывода (чаще всего это консоль) - "345", т.к. в операции стоит прединкремент.

ВНИМАНИЕ !
В разных вариантах реализации библиотеки cout синтаксиса с++ (да и просто с) конструкция cout << * ++b; будет работать по разному.
В некоторых вариантах cout << * ++b; выдаст саму строку b, в других выдаст число. Численное значение указателя b. А для вывода собственно строки b нужно написать cout << ++b;
Смотря какой библиотекой пользоваться.

И это тема очередной головной боли программистов.


Второй вариант выдаст "hello"
Третий строку "Learn"
Redrik вне форума   Ответить с цитированием
Старый 13.10.2016, 15:34   #14
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
Сообщение от Redrik Посмотреть сообщение
указатель " * " (звездочка) это, на самом деле число. Чаще всего ЛонгИнт
вот, и причем тут тогда char?

Сообщение от Redrik Посмотреть сообщение
В этом смысле этот Ваш char *a; ++a; указывает на второй и далее байт строки "12345"
не верно, по полю для ответа видно что поместится 1-2 символа, ну а судя по тому что указатель на символ то один.
строку ни один вариант не выдает, везде символ. у задачек есть косяк - по длине поля ввода ответа можно прикинуть ответ.
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 13.10.2016, 15:40   #15
Redrik Меню пользователя Redrik Мужской
Аватар для Redrik
Участник
Stalingrad
Сообщений: 14020
Сообщение от gerodoth Посмотреть сообщение
вот, и причем тут тогда char?
Показывает компилятору и библиотекам, как с этой переменной общаться.

например
char * а;
long int * b;

операции а++ и b++ будут немного разными. В первом случае а будет увеличено на один байт (тоесть плюс один). А вот во втором, скорее всего на четыре байта.

Ну и тот же cout.
Как выводить *d если неизвестен тип этой переменной. Это чар, инт, лонг инт или вообще ссылка на объект.

---------- Сообщение добавлено 13.10.2016 15:40 ----------

Сообщение от gerodoth Посмотреть сообщение
не верно, по полю для ответа видно что поместится 1-2 символа, ну а судя по тому что указатель на символ то один.
строку ни один вариант не выдает, везде символ. у задачек есть косяк - по длине поля ввода ответа можно прикинуть ответ.
????
Redrik вне форума   Ответить с цитированием
Старый 13.10.2016, 15:47   #16
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
в ответе не строка а символ
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 13.10.2016, 15:49   #17
Redrik Меню пользователя Redrik Мужской
Аватар для Redrik
Участник
Stalingrad
Сообщений: 14020
gerodoth, прикольно,
Символ это а[1] или b[3]
Redrik вне форума   Ответить с цитированием
Старый 13.10.2016, 15:51   #18
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
вот и я так думал, но задачки повторяются иногда, стал тыкать символы, до этого индексы пробовал - нащупал,
char * a = "12345"; // *а = '1'
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 13.10.2016, 15:58   #19
Redrik Меню пользователя Redrik Мужской
Аватар для Redrik
Участник
Stalingrad
Сообщений: 14020
Сообщение от gerodoth Посмотреть сообщение
char * a = "12345"; // *а = '1'
Возможно.
Не берусь спорить
В бормане вроде *а - строка. В MS, вроде тоже.

Но разные библиотеки по разному работают с указателями.
И в большинстве это строка, а а[n] = это символ

Но,если мне не изменяет память вроде в Qt, я встречал, например, что a это строка.
Redrik вне форума   Ответить с цитированием
Старый 13.10.2016, 16:00   #20
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
ну тут уже объяснять не мне, может быть то что указатель символьного типа разрешает вывести только один символ, хз. по моей логике и я от нее пока не отвык указатель должен был быть типа строка, и возвращать строку, вот это было бы понятно.
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 13.10.2016, 16:04   #21
Redrik Меню пользователя Redrik Мужской
Аватар для Redrik
Участник
Stalingrad
Сообщений: 14020
Сообщение от gerodoth Посмотреть сообщение
казатель должен был быть типа строка, и возвращать строку, вот это было бы понятно.
А сейчас мало кто работает с чарами. Там столько заморочек с выделением памяти. Потом ее уничтожением. Плюс нельзя зайти за границу переменной, чтоб программа и не вылетела по эксепшену.
Гораздо удобнее работать со String-ами

Все эти задачки имеют лишь академический интерес.
Ну и прививают дисциплину программирования. Как бы дается понимание внутренней структуры памяти компьютера и распределения в ней переменных.
Redrik вне форума   Ответить с цитированием
Старый 13.10.2016, 16:42   #22
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
да вот тоже не могу припомнить чтоб я с ними работал в любом языке, хотя со стрингами чаще всего из примитивных типов, но задачки то валятся, надо решать.
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 13.10.2016, 16:50   #23
Redrik Меню пользователя Redrik Мужской
Аватар для Redrik
Участник
Stalingrad
Сообщений: 14020
gerodoth, онлайновые компиляторы должны где-то быть.
Поройся в инете.

Накатай туда своих примеров и радуйся.
Redrik вне форума   Ответить с цитированием
Старый 13.10.2016, 17:07   #24
gerodoth Меню пользователя gerodoth
Аватар для gerodoth
Участник
Бобруйск
Сообщений: 7626
да постфактум то можно, но по некоторым местам я не понял и после того как пощупал
__________________
быть пессимистом потрясающе. я всегда или прав, или приятно удивлён.
gerodoth вне форума   Ответить с цитированием
Старый 13.10.2016, 17:09   #25
Redrik Меню пользователя Redrik Мужской
Аватар для Redrik
Участник
Stalingrad
Сообщений: 14020
Сообщение от gerodoth Посмотреть сообщение
не понял
???
Redrik вне форума   Ответить с цитированием
Программирование - Средства разработки, СУБД, разработка, внедрение. WEB-технологии.
Волгоградский форум » Программы » Программирование »  С++ модификаторы доступа
Ответ

Кликни на объявление, получи скидку в КНС по промокоду "Галактика" - Acer Extensa 2519-C9NG - федеральный супермаркет компьютерной техники.учебные бухгалтерские курсы в ваоTWIN Gourmetмусорный контейнер 360 лкартотечный шкаф afc-06/6в

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Точка доступа по WiFi нет доступа, по LAN есть TEST Интернет 3 20.02.2010 12:07
Точка доступа LAN54 Компьютеры 6 10.12.2009 13:56
Точку доступа Wi-Fi swer Куплю 2 12.12.2007 18:36
Модификаторы ржавчины Залетный гость Домоводство 1 02.09.2004 00:54
Нет доступа jack МегаФон 8 19.02.2003 11:24

© 2001 - 2016 ВОЛГОГРАДСКИЙ ФОРУМ
Полное или частичное копирование материалов с сайта разрешено только при обязательном указании автора и прямой гиперссылки на материал.
Rambler's Top100 Рейтинг@Mail.ru