background top icon
background center wave icon
background filled rhombus icon
background two lines icon
background stroke rhombus icon

Скачать "А'21-4. Value Types"

input logo icon
Теги видео
|

Теги видео

C++
GameDev
Субтитры
|

Субтитры

subtitles menu arrow
  • enАнглийский
Скачать
00:00:04
все нормально или что-то произошло
00:00:07
все отлично так давайте тогда пока все
00:00:11
это не свалилась быстренько проведем
00:00:14
сегодняшнее занятие и начнём мы с того
00:00:16
что
00:00:17
обсудим доклад мой как-то на который он
00:00:20
так рекламировал в прошлый раз и я там
00:00:24
уже сказал что я на самом деле ошибки
00:00:27
когда там его представлял достала что он
00:00:29
работает ноти дог на самом деле он
00:00:30
работал на тот момент в insomnia games
00:00:33
но это у нас как бы абсолютно неважно
00:00:35
так и кто этот доклад посмотрел и кто
00:00:39
сделал такие выводы из этого доклада
00:00:44
я смотрел доклад взял вывод о том что
00:00:49
иногда устно проблему стоит смотреть с
00:00:51
точки зрения данных потому что чаще
00:00:53
всего
00:00:54
призыв какие данные есть в нашей
00:00:57
проблеме мы сможем полностью понять нашу
00:00:59
задачу сделать решение гораздо проще и
00:01:02
сосредоточимся именно на решение
00:01:04
проблемы не написание кода но это по
00:01:07
факту вот то что мы тоже
00:01:08
продемонстрировали в нашем примере
00:01:11
строить постами да с
00:01:14
экономической моделью игре действительно
00:01:16
вместо того чтобы проектировать
00:01:19
такие относительны непонятные вещи да
00:01:22
там анализировать домен и так далее так
00:01:25
далее мы всегда в общем то можем
00:01:27
попробовать вернуть на проблему под
00:01:29
другим углом и получить получить то что
00:01:32
мы действительно должны получить в
00:01:34
результате работающую программу они там
00:01:38
то что мы себе нафантазировали но на
00:01:41
самом деле там было несколько ключевых
00:01:44
очень хороших идей в частности
00:01:47
была идея такая что в какой-то момент
00:01:50
мне кажется когда мы стали говорить о
00:01:54
программировании это дело напишу
00:01:59
еще выяснится что мне планшет не
00:02:02
работает а вообще будет прекрасно
00:02:08
вот в тот момент когда мы говорим о
00:02:11
программировании мы
00:02:13
подразумеваем
00:02:15
как вы думаете что
00:02:19
описание по да это понятно это все
00:02:21
лирика
00:02:23
я кончал буду задавать вопросы про очень
00:02:27
абстрактные вещи но в докладе говорилось
00:02:30
о том что основная задача программисты
00:02:32
это прям написать код который
00:02:34
преобразует данные за новой формы в
00:02:35
другую то есть сформирует данные это как
00:02:39
бы ну понятно ключевая задача если вот
00:02:41
на это все взглянуть вот с точки зрения
00:02:42
на какой-то вот самую самого
00:02:47
высокоуровневого
00:02:49
высоты птичьего полета что ли с точки
00:02:52
зрения человеческой деятельности давайте
00:02:55
вот так подскажу то почему я бы хотел
00:02:59
на ту мысли на который я бы хотел вас
00:03:02
натолкнуть
00:03:04
это понятно да а программиста то кто
00:03:10
человек который срок программы
00:03:13
формулируешь алгоритмы и преобразующего
00:03:16
в инструкции понятной машин это все так
00:03:18
да но если бы мы вот попытались сказать
00:03:22
вот у нас не было словно про границ да
00:03:25
каким бы другим бы словом мы назвали бы
00:03:27
человека который вот пишет эти самые
00:03:29
программы и
00:03:31
оператора вы вот-вот там прозвучал очень
00:03:34
хорошие слова которые хотел услышать это
00:03:37
слово инженер и по факту
00:03:39
программирование да вот этот programming
00:03:41
который написал это
00:03:43
другое название для слова инжиниринг
00:03:47
поскольку не помню как она инженер
00:03:51
по мы вот так пишется
00:03:53
инжиниринг и
00:03:56
вот это как бы прямая связь между
00:04:00
программированием и инжиниринга мной или
00:04:02
на русский язык воротят более
00:04:04
благозвучно перевести как инженерное
00:04:06
дело мне кажется в какой-то момент
00:04:08
потерялась да а вот
00:04:10
что мы вообще бы подразумевали под
00:04:12
инжиниринга что это такое
00:04:15
тоже понятно что очень спорная и так
00:04:20
далее так далее но вот какое-то такое
00:04:22
зерно ключевое
00:04:27
инженеры тот человек который использует
00:04:30
имеющиеся научные знания аппараты того
00:04:32
что создавая своих основе что то новое
00:04:34
ну это хорошая история да
00:04:40
ну давайте мы чуть чуть более
00:04:44
определенно скажем для нашего случая и
00:04:48
кстати вот тут я хотел сказать что типа
00:04:50
вот под ваши определения еще подходит
00:04:53
очень слова дизайнер да и мы с вами на
00:04:55
самом первом занятии немножко при дизайн
00:04:57
поговорили ему сказали что типа дизайн и
00:04:59
тут такая штука которая там работает в
00:05:02
рамках ограничений и второе фильтром 1
00:05:05
ключевое слово которое относится к
00:05:06
дизайну это слово ограничения так вот я
00:05:09
бы сказал ну и не только я это
00:05:12
общепризнанно что дизайнер на самом деле
00:05:13
это инжиниринговая профессия-то и
00:05:15
дизайнеров такой же инженер и вот именно
00:05:18
этим он отличается тем что этот есть у
00:05:21
него ограничение тем что он пользуется
00:05:23
инженерными знаниями он собственно
00:05:25
отличается например художника да и
00:05:27
поэтому когда вот у вас есть там в
00:05:30
команде два человека у вас есть например
00:05:33
артист и у вас есть дизайнер да это
00:05:36
абсолютно разные люди у которых
00:05:37
абсолютно разные области интересов
00:05:39
область ответственности область задач и
00:05:40
так далее и так далее хотя очень часто
00:05:43
пытаются сказать что нет то есть это как
00:05:46
бы один человек но на самом деле это два
00:05:48
разных человека и у них абсолютно разный
00:05:50
взгляд на одно и то же так вот как бы
00:05:53
частично вот то что мы говорили о
00:05:55
дизайнере она относится сюда мы
00:05:57
действительно когда работаем там в
00:05:59
рамках
00:06:00
каких-то инженерных задач да . тоже как
00:06:03
вы программисты работаем с инженерными
00:06:05
задачами ну соответственно мы
00:06:06
естественно вот эту историю про
00:06:08
ограничения
00:06:10
применяем но здесь мне как бы другой
00:06:12
момент еще хотелось бы подчеркнуть более
00:06:14
вот специфичные для программирования и в
00:06:16
докладе мы как-то ну проекта было
00:06:18
сказано до кто-то хотел высказаться
00:06:26
извиняюсь
00:06:37
так какие идеи о
00:06:46
сегодня какой-то день катаклизмов
00:07:18
так я кстати опять вас не слышу это
00:07:21
потому что все молчат или у меня опять
00:07:22
еще развалилась здесь у нас чары
00:07:25
выдумает все молчат окей так ну давайте
00:07:29
я попробую вас натолкнуть на вот такую
00:07:31
историю до что
00:07:34
как мне кажется
00:07:37
инженер это человек вот как вы правильно
00:07:40
сказали что он там пользуются научными
00:07:42
знаниями и так далее так далее да но
00:07:44
ключевое что
00:07:45
человек он работает в первую очередь
00:07:48
инженер это человек который в первую
00:07:50
очередь работает там с техникой или с
00:07:52
человеком машинной системой если мы там
00:07:55
говорим да о том как там человек с этой
00:07:57
машиной взаимодействует и
00:07:58
соответственно его задачу входит
00:08:01
использование вот этих вот технических
00:08:05
средств которые у него есть по максимуму
00:08:08
но для того чтобы собственно свою задачу
00:08:10
решить и вот этим инженер он отличается
00:08:14
от других
00:08:15
людей которых мы можем сюда вот так вот
00:08:19
перерисовать например от ученых do so
00:08:22
when this
00:08:24
или от ну сантис ладно я не буду
00:08:28
рисовать отдельные стрелкой я просто
00:08:30
скажу что больше здесь нас
00:08:32
качество этих об ученых интересует не
00:08:35
какие то абстрактные ученые а людей
00:08:36
которые занимаются математикой или
00:08:38
компьютер сайнса мы их объединим в одну
00:08:42
группу да и скажем что этому тимати шанс
00:08:45
у нас вот так вот так назову
00:08:47
соответственно эти люди они тоже
00:08:50
занимаются программированием но та
00:08:53
область как бы знание область интересов
00:08:55
которые у них есть она очень сильно
00:08:57
отличается от той области с которой
00:08:59
работаем и если они работают с
00:09:01
программированию в теоретической
00:09:02
плоскости и
00:09:04
в их область интересов входят больше
00:09:07
исследования но каких то математически
00:09:09
особенностей там алгоритмов
00:09:12
математические особенности структуры
00:09:14
данных вот например мы сегодня будем
00:09:15
говорить правду мы не будем называть эту
00:09:19
этот термин
00:09:23
в рамках наших лекций но раз я
00:09:26
эфир назвал его сейчас озвучу да это лги
00:09:28
про и ческие структуры данных алгебра и
00:09:31
data types
00:09:33
data types на самом деле хотя слышал
00:09:37
кто-нибудь этот термин и
00:09:43
может привести пример какого-нибудь
00:09:46
алгебраического типа данных
00:09:51
возможно матрицы нет
00:10:01
но самые известные алгебраические тип
00:10:03
данных флага не буду вас тут мучить это
00:10:05
связанный список linkin лист или просто
00:10:08
лист а
00:10:10
алгебраическим он называется потому что
00:10:13
если вы будете рассматривать какую-то
00:10:16
абстрактную алгебру дочитаю теорию
00:10:18
категорий соответственно вы там можете
00:10:20
ввести
00:10:21
такую категорию типов или множество
00:10:24
типов соответственно на этом множестве
00:10:27
типов вот как мы как в математике в
00:10:30
теорию групп делали задавать в
00:10:31
героической операции от операцию типа
00:10:33
сложения операцию типа умножения ну и
00:10:36
соответственно из
00:10:38
базового множество типов используя
00:10:41
заданные операции типа сложения типа
00:10:43
умножения вы можете построить связанный
00:10:45
список но кому интересно можете
00:10:47
нагуглить как это делается и
00:10:51
в область интересов математики как раз
00:10:54
ну или вот этих вот ученых наших
00:10:55
абстрактных в входит как раз
00:10:59
построение абстрактных рассуждений о
00:11:02
свойствах вот таких вот например
00:11:04
абстрактных типов данных и о том как
00:11:08
можно поверх этих абстрактных типов
00:11:10
данных писать программы но и тут сразу
00:11:11
возникают всякие функциональные языки
00:11:14
там не знаю хаскеле леску вы можете
00:11:16
использовать функциональный язык
00:11:18
программирования как средство
00:11:20
рассуждения и например надо абстрактными
00:11:23
или надо алгебраическими типами данных
00:11:25
давать от какие-то там операции
00:11:27
описываете операции ну и что то там
00:11:30
выводя это все конечно прекрасно и я уже
00:11:33
на первом занятии говорил что сейчас
00:11:36
есть такая ну как по моему мнению очень
00:11:38
нездоровая тенденция когда многие
00:11:41
принципы функционального
00:11:42
программирования пытаются затянуть в
00:11:44
императивные языки дороти плюс плюс это
00:11:46
там на каком-то уровне протекло яву это
00:11:48
протекло и так далее так далее но это не
00:11:51
всегда полезно и
00:11:54
я бы даже сказал их иногда может быть
00:11:56
даже напрямую вредно так вот с точки
00:11:59
зрения ученых их интересуют
00:12:01
теоретические аспекты и рассуждения
00:12:04
которые можно строить да на какой-то там
00:12:06
теоретической базе не каких-то
00:12:08
теоретических моделях другой стороны мы
00:12:11
с вами инженеры
00:12:13
и нас интересует практическая сторона
00:12:16
вопроса то есть мы должны рассуждать об
00:12:18
алгоритмах структурах данных и вообще
00:12:20
всем что происходит в там наших
00:12:24
программах наших играх именно с
00:12:26
практической точки зрения но здесь под
00:12:29
практически подразумевается что мы
00:12:30
должны для того чтобы писать программы
00:12:32
максимально полно учитывать возможности
00:12:34
оборудования до на котором этих программ
00:12:37
выполняет свою собственную как тут про
00:12:38
это очень четко говорит что там если
00:12:41
внимательно смотрели устал что
00:12:43
есть такое
00:12:48
неправильное суждение вот он говорит что
00:12:50
есть три лайс или три лжи о
00:12:53
программировании соответственно одна из
00:12:56
лучей вот этих говорит что
00:12:58
software platform то есть программное
00:13:02
обеспечение является платформой но и мы
00:13:04
можем там писать программы опираясь на
00:13:07
возможность этой программной платформы
00:13:09
которая куда-то программа платформу все
00:13:12
правильно который у нас есть он ведь это
00:13:14
на самом деле не так потому что х2 и за
00:13:16
платформ то есть у нас есть какая-то
00:13:18
физическая машина аппаратное обеспечение
00:13:21
именно эта машина выполняет нашу
00:13:23
программу и когда мы пишем нашу
00:13:26
программу мы должны полностью понимать
00:13:28
как эту программу взаимодействует с
00:13:31
аппаратной платформой как она на этой
00:13:33
самой аппаратной платформе выполняется и
00:13:35
вот здесь все собственно начинает
00:13:37
немножко ломаться потому что когда мы
00:13:40
рассуждаем о программировании вот
00:13:42
например точки зрения дом и древним
00:13:44
дизайна мы говорим что да у нас есть там
00:13:47
предметную область этой предметной
00:13:49
области и сущности они вот
00:13:51
взаимодействуют там и мы начинаем
00:13:52
строить какие-то
00:13:53
объектно-ориентированной модели но при
00:13:56
этом мы полностью
00:13:58
игнорируем платформу и
00:14:00
строим решение исходя из вот этих вот
00:14:03
идеальных наших представлений о том как
00:14:05
с точки зрения предметной области должна
00:14:07
быть задача решена как с точки зрения
00:14:09
этой предметной области программы должна
00:14:11
выполняться но ну и соответственно
00:14:13
строим вот то что мы очень любим строить
00:14:16
а мы очень любим строить абстракции
00:14:18
соответственно построили написали
00:14:20
программу начинает плохо рабу почему
00:14:23
потому что мы не учли особенности
00:14:25
аппаратной платформы на которой она
00:14:28
выполняется это самая программа и
00:14:30
появляются люди типа performance инженер
00:14:34
с это те люди которые занимаются
00:14:36
оптимизация me и они пытаются собственно
00:14:38
программу привести в рабочее состояние
00:14:40
чтобы она
00:14:42
начала с какой-либо там нормальной
00:14:45
производительностью на конкретный
00:14:47
платформе работать и
00:14:49
очень часто оказывается так что в этот
00:14:52
момент абстракции начинают ломаться
00:14:54
потому что то что происходит на железе
00:14:56
очень сильно отличается от того с чем мы
00:14:58
там на абстрагировались и для того чтобы
00:15:01
наша программа показывала хорошие
00:15:03
характеристики производительности эти
00:15:06
абстракции надо ломать данные надо
00:15:08
переформатировать надо делать еще что-то
00:15:10
ну и соответственно писать программы
00:15:11
совсем по-другому чтобы они
00:15:13
действительно использовали аппаратные
00:15:15
возможности ну и там как бы такой bottom
00:15:18
line как бы вывод от всего этого что
00:15:21
наверное более правильно особенно в
00:15:24
программировании игр и особенно в
00:15:27
программировании низкоуровневых и гордо
00:15:29
то есть
00:15:31
хорошо сказал то есть движков до или вот
00:15:34
того нижнего слоя который максимально
00:15:36
плотно взаимодействовать с оборудованием
00:15:38
это самое оборудование собственно брать
00:15:41
всегда в расчет да но и вот собственно
00:15:44
про это у него и доклад и там есть
00:15:46
несколько показательных примеров в
00:15:48
принципе если вы себя там чувствуете не
00:15:51
очень уверен у вас м вверх и прочих
00:15:53
делах то наверное
00:15:55
последнюю треть доклада когда там он
00:15:57
показывают всякие компилирование код и
00:15:59
там обсуждают что не очень хорошо там
00:16:02
оптимизатор работает это дело можно
00:16:03
относительно пропустить вот первые две
00:16:06
трети они очень полезны
00:16:08
того что очень четко показывают
00:16:12
именно вот инженер насьта года что мы
00:16:16
называем программировать и забывать про
00:16:18
это в общем-то не
00:16:21
советуется скажем вот так окей теперь
00:16:25
посмотрим на вот эту провокационную
00:16:27
картинку до в свете всего прочего что мы
00:16:30
можем сказать почему
00:16:32
такая вот провокационные картинки есть
00:16:36
какой основной посыл который в нее
00:16:39
заключён в
00:16:41
итоге для достижения производительности
00:16:43
все равно придется писать насиб ну тут
00:16:46
именно так единственное что не только
00:16:50
для достижения производительности а
00:16:51
вообще для решения по факту любой задача
00:16:54
вы как бы в своем развитии
00:16:57
проходите все вот эти ступени да то есть
00:17:00
сначала вы начинаете писать программу
00:17:02
максимально просто выражаю свои идеи
00:17:04
максимально просто это было на первом
00:17:06
занятии у нас до когда мы с вами
00:17:08
написали программу или на втором когда
00:17:10
мы написали программу в структурном
00:17:12
стиля максимально просто там выразили
00:17:14
какие-то идеи
00:17:16
программы работала потом по мере
00:17:18
изучения ну и компьютер сайнс и си плюс
00:17:21
плюс вы соответственно начинаете
00:17:22
использовать все большее и большее
00:17:24
количество возможностей и вот как мы
00:17:26
начали использовать
00:17:27
объектно-ориентированное
00:17:28
программирование сегодня мы поднимемся там за 3 ступени
00:17:32
поговорим про темплейт me the
00:17:33
programming правда очень
00:17:37
узких рамках да не будем там самые дебри
00:17:40
залезать но в какой то момент вы
00:17:42
понимаете то есть у вас вот этот степень
00:17:45
просветление это наступают все больше и
00:17:47
больше да вы начинаете понимать что на
00:17:49
самом то деле для практических задач все
00:17:51
это становится ненужным потому что все
00:17:54
вот эти возможности языка они по
00:17:56
большому счету скрывают начинают
00:17:58
скрывать от вас ту задачу которую вы
00:18:00
решается да и вы начинаете как бы
00:18:03
прогрессировать с точки зрения как
00:18:06
программист становитесь лучшим
00:18:07
программистом но в этот же момент
00:18:09
начинаете
00:18:10
деградировать с точки зрения сипло сплав
00:18:12
юзера то есть вы все меньше и меньше
00:18:14
возможность если плюс плюс используйте
00:18:16
до тех пор пока вы не понимаете что а на
00:18:17
самом-то деле вам ничего и не надо надо
00:18:20
просто очень четко понимать входные
00:18:22
данные и выходные данные и очень четко
00:18:24
понимать как происходит трансформация
00:18:26
данных на железе и вот в этот момент
00:18:28
оказывается что
00:18:30
99 процентов всех ваших потребностей
00:18:32
покрывается как раз базовыми
00:18:35
особенностями языка или базовыми
00:18:37
возможностями языка которые вот тут
00:18:39
условно так и названы сил
00:18:44
вот такой мой
00:18:47
монолог
00:18:48
понятно что григорий ш снизу не хватает
00:18:51
но на самом деле это уже супер и вертел
00:18:54
потому что современные компиляторы там
00:18:57
си плюс плюс да они могут при правильном
00:19:00
подходе нормально там за оптимизировать
00:19:02
ваш код и в 99 опять же процентах
00:19:05
случаев сегодня уже писать на самом деле
00:19:07
смысла никакого нет более того этом
00:19:11
периодически рассказываю историю как я
00:19:13
оптимизировал
00:19:16
хэш-функцию на сервере а потом
00:19:18
скомпилировал ее и понял что я
00:19:20
оптимизировать абсолютно не могу это
00:19:22
правда было очень и очень давно мне
00:19:24
кажется там лет 15 назад но общая идея
00:19:27
была такая что я тут решил написать
00:19:29
очень крутую хэш-функцию и в поскольку
00:19:32
она то у меня постоянно в программе
00:19:33
вызывалась в реализация хэш-таблицы про
00:19:35
хэш-таблицы мы будем говорить в
00:19:37
следующий раз я была та дай-ка я ее типо
00:19:40
выпендрился напишу на сэндлер и но в
00:19:42
результате я выпендрился написал и на
00:19:43
ассемблере
00:19:44
так вот она как-то работал а потом думаю
00:19:48
но надо посмотреть а что мне компилятор
00:19:51
визуалстудию сделать наверно это был
00:19:53
2003
00:19:54
2003 студия на тот момент ну собственно
00:19:57
я написал эту хэш-функцию на
00:20:02
том себе плюс плюс откомпилировать и
00:20:05
увидел что
00:20:06
помимо того что я там на оптимизировал
00:20:10
вручную компилятор еще перри упорядочил
00:20:12
некоторые инструкции чтобы
00:20:15
наиболее эффективно использовать
00:20:18
конвейеры там у и в конвейер был у тех
00:20:22
процессоров кому интересно можете
00:20:23
посмотреть
00:20:24
про пенсию ные процессоры про
00:20:27
полноценный неполноценный конвейер и про
00:20:29
спаривание команд то есть гуглить можно
00:20:32
по словам спаривание команды вот в
00:20:33
компиляторе таблицы спаривания команд
00:20:36
естественно было и поэтому он мог их
00:20:37
переупорядочить так чтобы они были
00:20:39
максимально эффективны выполнены на
00:20:42
пенсионное архитектуре а у меня то есть
00:20:45
я конечно знал что такая штука есть но
00:20:47
уж по всем этим таблицам рыцарь и разби
00:20:50
росатом какая команда должна быть
00:20:52
записана в какой последовательностью
00:20:54
другое чтобы действительно происходило
00:20:55
вот эта штука со спариванием команд
00:20:57
естественная
00:20:58
этим заморачиваться не стал да отсюда
00:21:01
вывод что написанный вручную на сендере
00:21:04
абсолютно далеко не всегда будет
00:21:06
настолько же эффективным насколько вам
00:21:08
компилятор сейчас за оптимизирует так
00:21:10
что с этим бы я сейчас уже не
00:21:12
заморачивался ну кроме там самых-самых
00:21:14
может быть граничных случаев но вот
00:21:16
кстати у майка кто на как раз последней
00:21:18
трети доклада это показано
00:21:20
программы надо писать так чтобы
00:21:23
компилятор мог их оптимизировать да то
00:21:25
есть какую-то верхние уровни оптимизацию
00:21:27
вас и равно придется
00:21:28
делать сами это тоже но такой важный
00:21:32
момент который надо держать в голове то
00:21:34
есть совсем плохо писатель на языке не
00:21:36
надо надо писать хорошо ну и тогда в
00:21:39
результате у вас тоже получится хорошо
00:21:41
но тут опять же последние рассуждение
00:21:44
что доверять всему надо вот как вам
00:21:47
говорит никогда никому не доверяете в
00:21:48
этом тоже есть рациональное зерно то
00:21:50
есть доверять надо всему частично с
00:21:53
одной стороны вот там то что говорит мой
00:21:56
как на сто процентов верно это сто
00:21:57
процентов верно естественно на уровень и
00:22:00
движка то есть когда вы программируете
00:22:01
движок вам
00:22:03
майн сет как это сказать по-русски да
00:22:06
будет вот именно такой то есть
00:22:07
максимальная производительность
00:22:08
максимальная эффективность данных
00:22:10
максимальный подход с
00:22:13
точки зрения использования всех
00:22:17
возможностей аппаратной платформы и
00:22:18
учета того как она работает в чоп носа
00:22:21
особенности ее работы но когда вы
00:22:23
например геймплей программисты
00:22:25
программируете уже
00:22:27
непосредственно игровую логику какие-то
00:22:30
игровые правила там возможно будут
00:22:32
какие-то другие соображения то есть там
00:22:34
можно попробовать по использовать и те
00:22:37
же самые
00:22:38
подходы
00:22:40
объектно-ориентированного
00:22:41
программирования то есть в этом
00:22:42
несчастном ничего плохого нет но просто
00:22:43
ключевой момент на этом я закончу что
00:22:46
надо четко понимать что зачем вы делаете
00:22:49
какие средства для какой цели вы
00:22:51
используете и какие ограничения у вас
00:22:53
при этом есть все
00:22:56
короче кто доклад не посмотрел
00:22:59
максимально рекомендую его посмотреть
00:23:02
сам если погуглить по степи кунфу
00:23:05
соответственно по youtube каналах
00:23:07
погуглить либо просто погуглить по гуглу
00:23:11
на тему дата oriented design simple as
00:23:14
close есть еще несколько докладов на
00:23:15
тоже последующих конференциях си пи пи
00:23:18
кан которые развивают вот эти идеи там
00:23:20
например есть доклад когда рассказывали
00:23:23
как оптимизировали рендер по-моему в
00:23:26
хроме но это неточно то есть каком-то
00:23:29
браузере и там у них прям супер
00:23:33
производительность выросла но и там еще
00:23:35
несколько похожих докладов очень полезно
00:23:38
очень рекомендую посмотреть окей а мы
00:23:41
соответственно
00:23:42
продолжаем дальше разбираться с си плюс
00:23:46
плюс и как я в прошлый раз скажу что
00:23:49
сегодня мы
00:23:52
чуть-чуть сменим фокус да если до этого
00:23:55
мы там несколько занятий чувствовали
00:23:57
себя
00:24:01
так
00:24:03
начал писать и зачем-то стюарда вид из
00:24:07
меню на черный цвет
00:24:09
лайбрери
00:24:12
users и использовали язык
00:24:14
программирования си плюс плюс именно как
00:24:17
вот такие пользователи то сегодня мы
00:24:21
перейдем на уровень повыше и
00:24:25
будем чувствовать себя
00:24:27
лайбрери про этаж и кстати прежде чем мы
00:24:32
это начинаем делать опять давайте
00:24:34
вспомним доклад майка кто на и у него
00:24:37
там есть был прекрасный слайд на котором
00:24:39
было написано
00:24:40
возможности си плюс плюс которые мы не
00:24:42
используем кто-то помнит этот слайд что
00:24:46
там было написано
00:25:14
никто не помнит окей там было
00:25:20
был при я перри приведён или перечислен
00:25:24
список возможностей языка да например
00:25:27
операторы where loading
00:25:32
перегрузка операторов они в своем движке
00:25:38
и в разработке этой возможностью не
00:25:41
пользуются далее там был такая штука как
00:25:45
template
00:25:47
me the programming 0 и template
00:25:50
далее там была такая штука как
00:25:53
exceptions мы не используем исключения
00:25:58
ну и там еще сказали что не
00:26:02
используются
00:26:04
так что я забыл
00:26:09
мал теплом харитон снова его мы с вами
00:26:12
уже обсудили
00:26:16
так перед once
00:26:23
ну и еще что тогда было там сказано что
00:26:26
мы используем кастомные локаторы не
00:26:28
используем стандартный так вот из этого
00:26:31
самое смешное заключается в том что как
00:26:34
раз вот этот набор возможностей то есть
00:26:37
перегрузка операторов исключения и
00:26:40
шаблона мы как раз и подразумеваем это
00:26:43
те механизмы языка си плюс плюс которые
00:26:46
в первую очередь нацелены на
00:26:49
написание библиотек не соответственно те
00:26:52
люди которые будут писать библиотеки они
00:26:55
подразумеваются будут этими
00:26:56
возможностями пользоваться чтобы эти
00:26:59
самые библиотеки создавать ну как мы
00:27:02
видим до профессионалы профессиональной
00:27:04
разработки говорят что на самом деле это
00:27:06
не совсем так мы опять же надо очень
00:27:09
очень аккуратно выбирать то подмножество
00:27:12
языка который вы будете использовать но
00:27:14
тем не менее мы как минимум перегрузка
00:27:16
операторов и шаблоны рассмотрим про
00:27:18
исключения тоже немножечко поговорим о
00:27:21
каких объемах использовать решать вам но
00:27:25
опять же прежде чем этим заняться
00:27:27
давайте мы скажем так что же такое
00:27:30
библиотека что мы подразумеваем под
00:27:32
библиотекой и
00:27:35
почему мы бы хотели вот этих
00:27:38
возможностей языка для того чтобы эти
00:27:40
самые библиотеки писать
00:27:43
так у кого есть какие идеи что такое
00:27:46
библиотека
00:27:49
это модуль который содержащий содержащий
00:27:52
какие-то merced алгоритмы решение для
00:27:54
диалогов класса задач именно так и есть
00:27:58
но если совсем базовые рассуждать когда
00:28:00
мы с вами пишем программы особенно эта
00:28:04
программа из одной предметной области
00:28:06
там грубо говоря игры или иногда были
00:28:09
очень часто
00:28:11
какой точки зрения посмотреть
00:28:14
программы из разных предметных областей
00:28:17
то есть кто-то пишет и игры а кто-то
00:28:19
пишет не знаю математические расчеты а
00:28:23
третий пишет бизнес софт вода обработку
00:28:26
каких-то
00:28:28
счетов ордеров и и так далее
00:28:31
они замечают что одни и те же алгоритмы
00:28:33
или одни и те же структуры данных у них
00:28:36
постоянно повторяются там 90 процентов
00:28:40
случаев или 90 процентов таких
00:28:44
структур данных и алгоритмов мне кажется
00:28:47
мы уже как пик записывали еще раз запишу
00:28:49
это контейнер и
00:28:57
контейнер то есть это такие структуры
00:29:00
данных которые предназначены для
00:29:02
хранения каких-то элементов данных да мы
00:29:06
с вами хранили trade посты в векторах
00:29:09
вот по рост электорат классический
00:29:10
пример контейнера и
00:29:13
там выйти же 90 процентов базовые
00:29:18
алгоритмы которые с этими контейнерами
00:29:20
делают что-то полезное да ну например мы
00:29:23
эти контейнеры давайте уделена напишу
00:29:25
можем сортировать
00:29:28
мы можем выполнять в них поиск
00:29:34
ну давайте сюда условно напишу мы их
00:29:37
можем каким-то образом заполнять
00:29:40
фил или jennie reid ну кроме того есть
00:29:44
там
00:29:47
ладно transform напишу сюда же так мы и
00:29:50
значит можем заполнять фил или jennie
00:29:52
reid
00:29:55
ну либо мы их можем каким-то образом
00:29:57
преобразовывать из одного вида в другой
00:29:59
да то есть либо преобразовывать данные
00:30:01
по элементы которые там содержатся либо
00:30:04
был один вид контейнеры мы преобразовали
00:30:07
его в другой вид контейнера transform и
00:30:10
вот это вот функциональность она
00:30:12
является настолько базовый настолько
00:30:14
универсальной что в любой программе
00:30:17
любой предметной области так или иначе
00:30:19
вы будете
00:30:20
всеми или там большинством возможностей
00:30:24
пользоваться но и оставшиеся 10
00:30:26
процентов это же вот так вот тут нарисую
00:30:29
это какие-то экзотические вещи но
00:30:32
которые там тем не менее могут оказаться
00:30:34
полезными
00:30:36
какие непонятно но тем не менее
00:30:38
наверняка нее есть и
00:30:40
отсюда мы делаем вывод что понятно
00:30:43
каждый раз вот это все переписывать
00:30:45
наверное бессмысленно поэтому нам
00:30:47
хотелось бы создать
00:30:48
универсальную библиотеку один раз
00:30:50
написать протестировать и дальше
00:30:52
собственно этим делом
00:30:54
пользоваться
00:30:57
понятно теперь давайте подумаем почему
00:31:00
нам не хватает языковых возможностей
00:31:04
например вот тех которые мы с вами
00:31:06
рассмотрели в прошлый раз для реализации
00:31:09
библиотек почему бы мы хотели новых
00:31:11
возможностей которые даёт нам язык
00:31:13
программирования для того чтобы
00:31:15
реализовать такие библиотеки
00:31:21
элиас как типом
00:31:23
это как один из артефактов то есть
00:31:27
привязка к типам это
00:31:28
скорее следствия
00:31:32
потому что язык плохая
00:31:34
почему язык плохой и за ростом этого
00:31:38
изначально нет
00:31:41
я близко lost он плохой вот все этого
00:31:45
изначально нет но в целом язык-то
00:31:47
хороший
00:31:49
есть свой интерес можно что-то 6-ую
00:31:52
есть свой центр и ваш нос если что то
00:31:55
делать ну да пожалуйста всею там все
00:31:58
делается через воет по enter и
00:32:01
вот как раз все плюс плюс да потому что
00:32:04
вот все это делается воет по интером oxy
00:32:07
plus + не делается воет по интером как
00:32:10
раз по тем причинам которые я хочу чтобы
00:32:12
вы назвали
00:32:30
так еще какие идеи
00:32:34
давайте напишу
00:32:37
это вот таким образом
00:32:41
reasons for
00:32:47
nokia мишу спешиал едишн all syntax
00:32:53
то есть причины появления
00:32:57
специального синтаксиса или каких-то
00:32:59
специальных синтаксических элементов
00:33:01
языке программирования которые
00:33:04
ориентированы именно на авторов
00:33:07
библиотек вот таких причин на самом деле
00:33:10
несколько и
00:33:12
первую причину давайте я обзову вот так
00:33:16
естественность использования или
00:33:21
натуральность
00:33:23
английский я назову это нaйти фьюз что я
00:33:26
под этим подразумеваю
00:33:29
если вы помещаете что-то в библиотеку ну
00:33:34
какой-то тип данных например библиотеку
00:33:36
вам бы хотелось чтобы
00:33:39
пользовать лет и библиотеки или вот того
00:33:42
типа данных которые есть в этой
00:33:44
библиотеке могли бы использовать этот
00:33:46
тип данных абсолютно таким же образом
00:33:49
каким они используют встроенные типы
00:33:52
данных в этот язык программирования
00:33:55
классический пример и этот пример у нас
00:33:57
кстати всплыл на
00:33:59
просто лекции это то что я
00:34:03
лично для себя сейчас мы про это тоже
00:34:05
поговорим и объясню почему называю well
00:34:09
you типами понятно что все плюс плюс
00:34:12
такого понятия как well you type
00:34:14
изначально нет но он есть например в
00:34:17
сишарпе и кто на шарфе программировал
00:34:20
сейчас нам расскажите что это такое но
00:34:22
базовая идея что
00:34:25
well you type это некоторый тип который
00:34:28
должен быть для пользователя ввести
00:34:31
точно также как встроенный примитивный
00:34:33
тип ну например тип int а тот пример
00:34:36
который спела у нас прошлый раз это был
00:34:38
пример с дублонами ли с деньгами да то
00:34:41
есть я бы хотел чтобы у меня в
00:34:44
библиотеке которая там ориентирована на
00:34:47
игру да именно вот на мою конкретную был
00:34:50
некоторый тип там деньги или дублоны
00:34:54
докатились назвал в прошлый раз и этот
00:34:56
тип должен вести себя с точки зрения
00:34:59
использования и его синтаксиса и
00:35:02
семантики
00:35:03
точно также как быть себя вел тип int да
00:35:07
то есть я могу взять и сказать что вот у
00:35:10
меня есть некоторые money м1 и м2 и
00:35:14
дальше я могу их например складывать м 1
00:35:17
+ n2 я могу их сравнивать между собой м1
00:35:20
равно м2 ну и так далее если язык не
00:35:24
поддерживают специальных средств которые
00:35:27
бы позволили вот таким вот образом
00:35:28
например
00:35:30
переопределять операции да и говорит что
00:35:32
вот для этого конкретного типа вот эта
00:35:35
операция будет подразумевать или будет
00:35:37
означать то то соответственно это будет
00:35:40
невозможно языках которые не
00:35:42
поддерживают перегрузку операцией типа
00:35:44
того же самого си
00:35:46
для типов которые вы вводите вот этот
00:35:49
самый найти фьюз невозможен если вы
00:35:52
хотите складывать деньги вам нужно будет
00:35:55
функция и думание который будет
00:35:57
принимать там m1 и m2 их складывать
00:35:59
возвращать результат но это уже не будет
00:36:02
выглядеть естественно да потому что нету
00:36:06
синтаксиса который бы позволил это
00:36:08
делать ok давайте еще какую-нибудь
00:36:12
причину придумаем
00:36:20
возможно мы можем делать хитрая
00:36:23
специализации к настроение основаны на
00:36:25
типах аргументов которые мы принимаем
00:36:27
прочие вещи да а для чего нам это нужно
00:36:30
само его за пару него идея
00:36:32
это что некоторые типы мы хотим
00:36:35
по-разному обрабатывать в одних и тех же
00:36:37
с точки зрения алгоритмы ситуациях нокий
00:36:41
как это называется у меня была идея
00:36:43
другая ли оно тоже подходит так а более
00:36:47
опять же общий эта идея как называются
00:36:51
специализация нет ну специализация это
00:36:56
уж образуются
00:36:58
обобщение не совсем орфизм вот это
00:37:02
полиморфизм только на самом деле это
00:37:05
специальный полиморфизм где все + + но
00:37:08
там это супер абстрактная штука чего
00:37:11
какой полиморфизма как он там
00:37:13
реализуется сейчас сколько это пишу
00:37:16
полиморфизм так вот есть полиморфизм
00:37:20
времени выполнение это то что основано
00:37:23
на виртуальных функциях мы с вами
00:37:24
рассмотрели а также есть полиморфизм
00:37:26
времени компиляции это вот эту самую
00:37:28
специализация про который вы говорите и
00:37:31
правильно там по-научному
00:37:34
специализация называется кто знает как
00:37:38
hedgehog ad-hoc полиморфизм да так что
00:37:42
такое отход
00:37:47
от hook
00:37:51
полиморфизм
00:37:54
ну а txeq это латинское слово очевидно
00:37:58
до которой переводится по-русски напишу
00:38:01
то будет стран лестницу по-английски для
00:38:04
этого или для этой цели
00:38:14
для этой цели ну соответственно когда вы
00:38:19
специализируетесь какой-то шаблон или
00:38:22
когда вы там еще перегрузка функций тоже
00:38:25
и является реализация метод реализации
00:38:27
механизма ad-hoc полиморфизм ада когда
00:38:30
вы говорите что вот конкретно для этих
00:38:31
типов аргументов надо вот выполнить вот
00:38:34
этот код да это
00:38:36
собственно и есть ad-hoc полиморфизм вы
00:38:38
берете какое-то полиморфные поведение
00:38:41
приспосабливается для конкретной
00:38:43
ситуации но кроме того есть еще еще один
00:38:46
вид полиморфизма сейчас моторы про него
00:38:48
скажем так
00:38:50
с этим разобрались еще для чего мы хотим
00:38:54
использовать спешил syntax вот этот
00:38:57
самый
00:39:02
вот как раз вы говорили проводит со
00:39:05
звездочкой всегда все можно сделать
00:39:07
через водится звездочкой и очень многие
00:39:09
вещи делаются через водятся звездочка
00:39:11
вот например реализация quick сорта в си
00:39:14
если там поищите да эта функция к сорт
00:39:17
который понимает собственно воет pointer
00:39:20
на тот буфер там даже нет такого понятия
00:39:24
как ну точнее понять это понятно есть да
00:39:26
но как бы правильнее об этом думать что
00:39:28
функция sort принимает именно буфер с
00:39:31
данными и
00:39:32
элементы которые там хранятся именно для
00:39:35
функций курорт в точки зрения с точки
00:39:37
зрения все абсолютно не важны она с ними
00:39:39
работает как там с областями памяти ну и
00:39:44
поэтому возникают две проблемы какие и
00:39:47
вот как раз эти две точки я тут и
00:39:50
раскрою
00:39:52
его первое очень на то что кастовать
00:39:54
сложно темплейты позволяет как бы
00:39:57
герреро со специализированных как мы это
00:40:00
назовем это в общем то вот именно то что
00:40:03
я говорю высокоуровневая термины хочу от
00:40:07
вас до или общие термины хочу от вас а
00:40:08
вы как раз говорить про их но уже с
00:40:11
точки зрения реализации
00:40:13
частности то есть вот это вот идей что
00:40:15
надо кастовать
00:40:18
типизации
00:40:20
оптимизм ну оптимизация и типизация да
00:40:24
теперь давайте это действительно вот эти
00:40:27
две точки 2 пойнта давайте теперь их
00:40:31
назовем совсем общими словами
00:40:33
оптимизация нужно для чего
00:40:40
для производительности соответственно
00:40:43
если у нас есть
00:40:45
хорошие механизмы которые позволяют нам
00:40:49
так перформансы принцу который позволяют
00:40:52
нам четко описывать типы того что
00:40:55
происходит то есть место вот этого
00:40:57
обобщенного водят со звездочкой сейчас
00:40:59
мы кстати тоже скажем что это такое да
00:41:01
поэтому кто не
00:41:04
не очень представляет не пугайте сейчас
00:41:06
все станет понятно так вот этот самый
00:41:08
водится звездочка он еще видно не может
00:41:11
быть оптимизирован компилятором потому
00:41:12
что компилятор не понимает что там за
00:41:14
ним нижележащие тип данных до как я
00:41:16
устал это какой то просто кусочек в
00:41:18
памяти с которым этот алгоритм и
00:41:20
пытается работать но если мы четко
00:41:23
параметре зулу им наш алгоритм
00:41:26
конкретным типом да и получим
00:41:28
параметрический полиморфизм учу так
00:41:30
называемый соответственно компилятор уже
00:41:32
сможет рассуждать о том на какие там
00:41:35
типы данных хранятся могу ли я применить
00:41:37
вот такую вот оптимизацию для
00:41:39
именно этого типа данных именно в этом
00:41:42
контексте и если он это может сделать мы
00:41:44
получим более высокопроизводительный код
00:41:46
но это там любимый пример который
00:41:49
приводит любители шаблонов си плюс плюс
00:41:52
в пику тем да кто любит си что некоторые
00:41:56
специалисты некоторые шаблоны да
00:41:59
некоторые специализированные алгоритмы
00:42:00
те же самые сортировки в си плюс плюс
00:42:02
после компиляции работают быстрее за
00:42:04
счет того что компилятор может в момент
00:42:06
компиляции проанализировать типы и
00:42:08
подставить более правильные инструкции
00:42:11
до по работы с этими типами такей а
00:42:14
вторая ваша идея была а вот с точки
00:42:16
зрения типов iq основания как мы можем
00:42:19
ее общим словом обозвать
00:42:23
может подтипа безопасность а это safety
00:42:27
или type t-iv это
00:42:30
так type
00:42:34
максимально не красиво написал
00:42:37
той сэйфти
00:42:41
но тут собственно все понятно да если вы
00:42:44
работаете с конкретным типом компилятор
00:42:47
может четко проверить что вы работаете с
00:42:49
этим типом правильно то есть что у этого
00:42:51
типа есть там эта операция до что этот
00:42:54
тип может быть там помещен в эту область
00:42:57
памяти ну и так далее все что мы
00:42:59
подразумеваем
00:43:02
в качестве достоинств вот так скажу
00:43:05
языков со статической типизации это
00:43:07
собственно здесь она и есть ну если
00:43:11
компилятор не может об этом не каким
00:43:13
образом понимать рассуждать да то
00:43:16
извините ваш код будет не типа
00:43:18
безопасной и если вы там что-то
00:43:20
накосячить а компилятор не каким образом
00:43:23
вас об этом предупредить и предотвратить
00:43:26
это не сможет собственно вот то есть вот
00:43:30
эти вот 4 основные пункта мы с вами
00:43:32
выделим
00:43:34
в качестве причин которые
00:43:38
добавляют специальный синтаксис язык
00:43:41
программирования для того чтобы авторы
00:43:43
библиотек но собственно могли свои
00:43:45
библиотеки разрабатывать вот с учетом
00:43:47
этих особенностей так ну и какие
00:43:50
возможности были добавлены вот тут я
00:43:52
сказал что одним из основных
00:43:55
синтаксических элементов для вот этого
00:43:58
естественного использования является
00:43:59
перегрузка операторов соответственно все
00:44:01
с этого начнем и посмотрим а все что с
00:44:04
остальное полиморфизм то рассказали это
00:44:07
перегрузка функций и специализация
00:44:10
шаблонов но собственной психики
00:44:11
performance они
00:44:13
реализуются им именно при помощи
00:44:16
шаблонов ладно писать не буду так ну и
00:44:19
давайте пойдем по этому списку и
00:44:23
разберемся что же такое перегрузка
00:44:25
операторов
00:44:31
оператор overlapping но прежде чем про
00:44:34
это говорить мы вернёмся к идее с well
00:44:38
you типами и попробуем понять что же
00:44:42
такое well youtube зачем он нам нужен
00:44:45
в каких языках программирования well you
00:44:48
типы 10 каких языках программирования их
00:44:51
нет и
00:44:52
почему
00:44:54
так тут мне кажется те кто программирует
00:44:57
на сишарп знает сша должны
00:45:02
узнать о есть цель этой значимой тебе в
00:45:06
потоке то есть вылетает это то что
00:45:10
передается ну копируется значение когда
00:45:13
передается куда-то опасаетесь
00:45:15
ответственно к в плюсах просто ссылка
00:45:17
передается создается стоять это
00:45:20
напоминает обычный цикл разве это прочь
00:45:24
кощей ну это вы говорите действительно
00:45:28
все правильно это деталях реализации и
00:45:31
собственно реализация была выбрана
00:45:35
именно такой потому что этим был youtube
00:45:38
это то есть потому что
00:45:40
блю типа
00:45:42
подразумевал это значение соответственно
00:45:45
потому что вот эти вот знали типы
00:45:47
значения правильный перевод они должны
00:45:50
обладать какой-то конкретной семантикой
00:45:53
да и так вот давайте мы подумаем какой
00:45:55
же семантика каким смыслом мы наделяем
00:45:56
эти володю типа почему для нас
00:46:00
ну не то что критически важно но
00:46:02
все-таки имеет смысл разделять на типы
00:46:05
вот на типы значения и типы которые мы
00:46:09
адресуем по ссылке
00:46:12
mood обильность но вот обильность это
00:46:15
отдельная история и она полностью не
00:46:18
пересекается вот с этим рассуждениям
00:46:20
хотя часто блю типа действительно делают
00:46:23
не мутабельным и особенно в явив которых
00:46:26
нет но их как бы хочется эмулировать это
00:46:29
тогда
00:46:31
optimize потому что мы не хотим
00:46:33
совершить лишь не действия с данными по
00:46:36
типу копирования или переноса передавать
00:46:39
по ссылке мы тоже можем не желать чтобы
00:46:41
было некоторым с опасность это все так
00:46:45
да но я бы сказал это не основное
00:46:47
отличие
00:46:58
ты же то что вы говорите я бы больше
00:47:00
сказал это
00:47:02
ну такие детали реализации
00:47:05
которые вытекают опять же из семантики
00:47:07
то есть действительно если мы учтем вот
00:47:10
эту вот основную идею об их назначении
00:47:12
об их семантики действительно у нас
00:47:14
будет получаться вот то что вы говорите
00:47:15
потому что это будет более эффективно
00:47:20
такой вот ну просто и тут опять же как я
00:47:23
люблю что называется давайте попробуем
00:47:25
подобрать
00:47:27
какой-нибудь ключевое слово одно которую
00:47:30
бы описала
00:47:35
смысл то есть семантику до вот этих
00:47:38
самых well you типов ну или может быть
00:47:41
чтобы было проще их противопоставлять
00:47:43
как вот в во всяких науках до
00:47:45
исследованиях особенно филологи кстати
00:47:48
это любят они любят все
00:47:49
противопоставлять когда вы что-то
00:47:51
противопоставляете чему тогда вам легче
00:47:53
собственно анализировать свойства того и
00:47:55
другого вот у меня есть well you type
00:47:57
это что все sharpie
00:48:00
называется reference type ссылочный тип
00:48:05
все плюс плюс этого немножко нет да но
00:48:08
это хорошая концепция
00:48:11
именно теоретическая которая позволяет
00:48:14
нам как структурировать наши знания о
00:48:17
том что общих программе происходит и
00:48:19
собственно применять так вот
00:48:22
ключевое слово которое отличит well you
00:48:26
типа tree friends типа
00:48:28
какой бы могли предложить
00:48:32
память ну память они все в памяти
00:48:36
ну можно рассуждать от того что
00:48:39
reference тип это классовое you type эта
00:48:41
структура и если класс описывает
00:48:44
какую-то
00:48:45
абстракцию то в youtube скорее свойства
00:48:49
этой абстракции но это в некотором
00:48:51
смысле
00:48:53
так наверное но немножко спорное
00:48:58
утверждение
00:49:00
хотя вот кстати книжки страуструп а там
00:49:03
есть книжка такая турка сипло вклад
00:49:05
восторга del как так она называется там
00:49:08
действительно то что вот я сейчас
00:49:09
называю в all you typed там у него
00:49:11
названа конкретными типами конкрит types
00:49:14
а собственно вот reference type это у
00:49:16
него там типа abs трактор мне эта
00:49:18
история не очень нравится потому что она
00:49:20
мне кажется не очень хорошо показывает
00:49:21
что является абстрактным типом а что
00:49:24
конкретно но и более того а вот у этих
00:49:27
терминов есть устоявшиеся значение
00:49:29
абстрактными типами мы называем но по
00:49:32
факту то что предоставляет и описывает
00:49:34
интерфейс это вот абстрактный базовый
00:49:36
класс например это абстрактный тип а
00:49:38
конкретным типом мы называем то что от
00:49:41
этого типа унаследована и этот интерфейс
00:49:43
реализует то есть если вспоминать вот
00:49:46
нашу идею с концу мирами продюсерами в
00:49:48
прошлый раз да у нас там была иерархия
00:49:50
наследования
00:49:51
базовым классом был
00:49:53
треть пост по моим он назывался да от
00:49:56
него был унаследован консьюмер и
00:49:58
продюсер смотреть пост предоставлял
00:50:00
интерфейс апдейт ну и там какой то
00:50:03
другой а концу миру продюсер собственно
00:50:05
этот самый обед реализовывал мы все и
00:50:10
в этом в этой иерархии наследований
00:50:12
достаточно абстрактным типом и
00:50:14
абстрактным классом у нас был предпо
00:50:16
способность на конкретными классами были
00:50:18
концу мир и продюсер в целом естественно
00:50:22
конкретным типом можно называть и любой
00:50:24
валюте потому что действительно он
00:50:26
содержит полную реализацию и полностью
00:50:29
описывает свойства там чего-то да и
00:50:31
поэтому действительно вот с точки зрения
00:50:32
этого рассуждения он называет конкретно
00:50:34
называется конкретным типом но он мне
00:50:36
кажется скрывает основную идею
00:50:39
окей слова не всплыло давайте я попробую
00:50:42
это слово написать а вы со мной либо
00:50:44
согласитесь либо опровергнуть и я буду
00:50:47
называть это слово uniq nes или
00:50:50
уникальность
00:50:52
что я под этим подразумеваю
00:50:55
под этим я подразумеваю следующее что
00:50:57
если у меня есть какой-то тип значения
00:51:01
ну например это значение 3 то если у
00:51:05
меня в программе этих значений много
00:51:07
этих троек да или там денег денег у меня
00:51:12
может быть например 2 доллара и 15
00:51:16
центов так вот эти значения неразличимы
00:51:19
друг друга все экземпляры типа int или
00:51:23
все экземпляры типом они они по факту
00:51:26
одни и те же они отличаются друг от
00:51:28
друга значениями понятно что 2 доллара
00:51:31
15 центов не равно 100 долларам
00:51:37
но с другой стороны 2 доллара 15 центов
00:51:41
абсолютно прекрасно равны двум долларам
00:51:44
15 центов но другим которые лежат в
00:51:47
другой области памяти если у вас есть
00:51:49
два контейнера в которых хранятся деньги
00:51:52
вы всегда можете сказать там одни и те
00:51:54
же сумму денег хранятся в
00:51:56
соответствующих позициях этого
00:51:58
контейнера да или нет то есть эти типы
00:52:01
для них важно значение которое в них
00:52:03
хранится но это значение сама по себе не
00:52:07
уникальна одинаковые значения не
00:52:09
отличимы друг от друга в то же время как
00:52:13
каждый экземпляр reference типа он
00:52:17
уникальный то есть если у меня есть три
00:52:20
пост кто каждый thread пост независимо
00:52:23
от того одинаковые данные там хранятся
00:52:25
до
00:52:27
если у меня есть рейд пост вот такой на
00:52:30
этом острове если у меня есть red пост
00:52:33
вот такой на этом острове соответственно
00:52:36
даже если у них все поля совпадают то
00:52:38
есть у него текущей стоп 10 вот так
00:52:42
напишу из 10 я рейд у него там -1
00:52:45
давайте сразу в этой модели напишем да а
00:52:48
у этого 3 поста сток те же самые 10 и
00:52:51
рейд у него тоже -1 но тем не менее они
00:52:54
уникальны да то есть это абсолютно два
00:52:57
разных объекта
00:52:59
несмотря на то что поля у них абсолютно
00:53:02
одинаковые то есть семантика их еще раз
00:53:05
эта семантику уникальности а вот дальше
00:53:08
все то что вы говорили в
00:53:11
свете во всякой уникальности она
00:53:14
абсолютно справедлива если у нас
00:53:18
значение неуникальное ну значит не имеет
00:53:20
смысла и хранить в уникальных областях
00:53:22
памяти там в динамической памяти хотя
00:53:25
вот кстати я вы это дело до и поэтому
00:53:27
если вы в яви кстати есть у нас люди
00:53:29
которые я узнаю
00:53:32
вот если вы хотите чтобы у вас в яви
00:53:35
объект имел семантику в youtube и что вы
00:53:39
сделаете
00:53:51
не даст
00:53:53
вам нужно как раз сказать что они не
00:53:57
уникальны вам нужно перегрузить метод и
00:53:59
coles и хэш-код
00:54:01
цикл все понятно эта штука которая
00:54:05
выполняет сравнение на равно да и вы
00:54:08
можете сказать что объект один объект
00:54:10
равен другому я вот когда это нужно
00:54:12
сделать она вызывает метод эклз вы
00:54:15
можете проанализировать значения полей
00:54:17
эти поля сравнить собственно вот у вас
00:54:19
появится ну такой эмулятор well you типа
00:54:22
хотя он будет вести себя как объект
00:54:24
будет храниться в куче потому что в яви
00:54:25
там стяжка с хранением объектов стеки до
00:54:28
этого мне сишарп а вот все шарпея
00:54:30
собственно как раз для того чтобы это
00:54:34
эту идею более ярко выразить и
00:54:36
оптимизировать реализацию как раз была
00:54:40
введена непосредственно
00:54:41
[музыка]
00:54:44
непосредственно
00:54:47
там нотация синтаксическая да не любит
00:54:51
барбара семантическая потому что это не
00:54:53
только
00:54:54
синтаксис и семантика
00:54:56
структурного типа строка и сказали что
00:54:59
вот он был you type он хранится
00:55:01
встретила сравниваются он будет
00:55:03
конкретно по значениям полей если
00:55:05
значение полей совпадают то вы по факту
00:55:07
2 разных структур и не различить и
00:55:09
независимо от того это один и тот же
00:55:11
объект то есть по одному и тому же
00:55:13
адресу вместе понять они хранятся им
00:55:15
собственно раз
00:55:16
окей так теперь что так все кстати
00:55:20
согласны с этим есть это
00:55:24
дополнение возражал есть вопрос вот вы
00:55:27
привели пример строить постами и здесь
00:55:30
они отличаются же по сути друг от друга
00:55:32
координатами как только эти координаты
00:55:35
будут равны не возникнет ситуация что ну
00:55:38
типа это один тот же trade пост если у
00:55:40
них одинаковые координаты и не
00:55:42
одинаковые поля также как два с
00:55:46
половиной доллара ибо с половиной
00:55:47
доллара до это отличный вопрос но тут
00:55:50
есть
00:55:52
короче на него ответ у меня нет шутка но
00:55:56
смысл такой что
00:55:59
отличаются они координатами да если эти
00:56:02
координаты здесь есть анти мы с вами в
00:56:04
прошлый раз говорили что для того уровня
00:56:08
моделирования которое у меня есть
00:56:10
координаты были абсолютно не важны и в
00:56:12
нашей модели мы ну там добавили имя
00:56:15
просто чтобы их можно было вывести но
00:56:17
для опять же расчеты для экономической
00:56:19
модели ими было не важно важно было то
00:56:22
что они реально разные а вот то что они
00:56:24
реально разные мы определяли только тем
00:56:28
что
00:56:29
мой это два разных объекта и мы не
00:56:32
анализировали равенство с точки зрения
00:56:34
равенство полей а мы анализировали
00:56:36
равенство с точки зрения один объект это
00:56:39
или нет и
00:56:40
дефолтной вот такое или по умолчанию то
00:56:43
сравнение которое предоставляет нам язык
00:56:45
си плюс плюс это собственно сравнение
00:56:47
указателей на них да то есть но по
00:56:49
одному адресу они лежат или нет но и во
00:56:51
всех остальных объектов которые языке в
00:56:54
которых есть reference типы собственно
00:56:55
вот эта крия присутствует а вот все
00:56:58
остальное это вопрос валидности данных
00:57:00
то есть если вы в своей программе
00:57:05
запрещаете по
00:57:08
правилам которые у вас есть иметь два
00:57:11
три поста которые бы находились в
00:57:14
разных точнее в одних и тех же
00:57:17
координатах тогда вы ну да то есть два
00:57:21
три поста которые будут иметь абсолютно
00:57:25
те же самые значения полей включая
00:57:27
координаты соответствие возникает вопрос
00:57:29
а почему вашу программу пришла в такое
00:57:32
состояние возможно инвариант там класса до который
00:57:36
описывает игровой мир ну понятно что вот
00:57:39
все это дело
00:57:40
она будет не сама по себе она будет
00:57:43
храниться где-то до в некотором классе
00:57:46
ну или если не объектно-ориентированный
00:57:49
подход но какой-то там другой до в
00:57:50
некотором контейнере который будет
00:57:53
хранить этот самый игровой мир game
00:57:56
world и у этого game world а помните мы
00:57:59
с вами говорили в прошлый раз будет
00:58:00
некоторые инвариант до
00:58:03
некоторый предикат который описывает его
00:58:06
корректность так вот если у вас
00:58:08
образуется два разных объектов с
00:58:10
абсолютно совпадающими значениями полей
00:58:12
включая координаты так вопроса нарушены
00:58:14
приятным инвариант если он нарушен это
00:58:17
одна история значит ваши данные
00:58:18
находится вне согласованном состоянии и
00:58:20
и вы что-то не так сделали а если он не
00:58:23
нарушено значит по вашей модели это
00:58:25
вполне себе корректно пожалуйста так
00:58:27
можно делать существует естественно
00:58:29
другие способы определять
00:58:34
уникальность объекта вот те кто
00:58:37
знаком с программированием баз данных и
00:58:39
это кстати тоже хорошая модель мир да
00:58:42
как в реляционной модели мы определяем
00:58:44
уникальность уникальность
00:58:47
по prime реке
00:58:50
той так relay module
00:58:56
это праймари кей
00:59:00
в
00:59:05
ну а у нас в языке программирования
00:59:08
можно вот так вот условно считать что
00:59:11
указатели то есть прайм реке и
00:59:13
собственно но тем не менее он определяет
00:59:15
уникальный объект ну какой то вот такой
00:59:19
какой то вот такое рассуждение
00:59:23
ответили на ваш вопрос или
00:59:26
неполнота есть у аврелию types of нет
00:59:29
какого-то прайма реке абсолютно нет да
00:59:32
это просто конкретное значение
00:59:37
но именно в этом и суть что для well you
00:59:40
type of нам абсолютно неважно
00:59:42
уникальность нам важно именно значение и
00:59:45
если она у меня вопрос к на
00:59:48
вот это разделение на виде type и
00:59:51
reference type и она на уровне
00:59:54
рассуждения или на уровне графическом
00:59:56
языка вот это отличный вопрос все
01:00:01
зависит от языка си плюс плюс это раз
01:00:04
уже это чисто ваши рассуждения то есть
01:00:08
какие-то типы вы считаете виллы и типами
01:00:11
и
01:00:12
в их реализации вы будете делать что-то
01:00:16
а именно вот то что мы сейчас будем
01:00:17
делать мы будем перегружать оператора
01:00:20
добиваясь от него такого поведения или
01:00:22
там более грамотно говоря наделяя его
01:00:25
семантикой чтобы они себя вели как вал
01:00:28
youtube и а для reference типов вы этого
01:00:31
делать не будете ну и соответственно они
01:00:33
будут считаться reference типами ну или
01:00:36
будете делать что-то другое но как
01:00:38
минимум операторы равенство вы
01:00:40
перегружать для них будете вряд ли вы
01:00:42
будете полагаться на равенство
01:00:44
указателей с другой стороны есть языки
01:00:47
программирования вот та же самый сишарп
01:00:49
в которых well youtube и reference тип
01:00:51
запределен закреплены на уровне
01:00:54
синтаксиса и семантики языка то есть
01:00:56
если вы делаете с тракта вы получаете
01:00:58
well youtube да если вы делаете
01:01:02
класс вы получаете собственно так
01:01:05
наоборот что ты там сказал мне туда или
01:01:08
сколько вы говорите с тракт вы получаете
01:01:10
волне тип когда вы говорите класс вы
01:01:13
получаете рефрен 100 в яви вы все время
01:01:15
получаете reference type до тех пор пока
01:01:18
не перегрузить и их волосы хэш-код чтобы
01:01:20
он стал условным well you type мы и так
01:01:23
далее
01:01:24
то есть есть языке в которых это
01:01:27
умозрительное заключение и вы его
01:01:30
придерживаетесь как программист вас
01:01:31
никто не вынуждает этого делать а есть
01:01:33
языки в которых это закреплено но просто
01:01:37
мне кажется это полезная концепция для
01:01:42
понимания да и поэтому
01:01:45
даже когда мы программируем и когда я
01:01:48
программирую на си плюс плюс которым
01:01:49
этого нет но это можно сделать да ну
01:01:52
полезно понимать что это такое и почему
01:01:55
вы это делаете
01:01:59
таким образом ну и теперь давайте тогда
01:02:03
собственно и перейдем к тому как мы это
01:02:06
делаем все плюс плюс
01:02:07
это оператор или логин как я уже сказал
01:02:10
собственно с точки зрения си плюс плюс
01:02:13
любой оператор эта функция у которой
01:02:17
есть прототип которая вызывается в
01:02:21
естественном виде то есть когда мы с
01:02:23
вами записываем что-то м 1 плюс м 2 эта
01:02:28
запись в естественном виде вот этот
01:02:31
оператор си плюс плюс рассматривает как
01:02:34
функцию или может рассматривать как
01:02:37
функцию
01:02:38
с определенной сигнатурой
01:02:40
сигнатура этой функции
01:02:43
оператор плюс
01:02:46
оператор плюс вот таким вот образом
01:02:49
поскольку эта функция тут есть какие-то
01:02:51
параметры ну и далее идет
01:02:56
возвращаемое значение полный список
01:02:58
параметров соответственно возвращаемое
01:03:01
значение у этой функции вы определяете
01:03:04
сами но скорее всего она будет каким-то
01:03:06
образом коррелировать с теми типами
01:03:07
данных которые вы в нее передаете ну
01:03:11
например если m1 и m2 money наверное вы
01:03:14
будете возвращать тоже money
01:03:17
таким вот образом ну это что вы
01:03:20
принимаете в качестве параметров этот
01:03:23
оператор бинарный он требует двух
01:03:24
аргументов собственно вы будете
01:03:26
принимать такие же самые мани мани
01:03:31
м1
01:03:33
mania
01:03:35
2 ну и все далее поскольку это обычная
01:03:39
функция вы реализующего как обычную
01:03:41
функцию и когда вы записываете вот таким
01:03:44
образом она будет вызвана то же самое с
01:03:48
операторами поскольку мы рассуждаем всю
01:03:50
эту историю вокруг уникальности
01:03:52
соответственно нам нужно перегружать
01:03:54
операторы которые определяют
01:03:56
уникальность это операторы равенства и
01:03:58
неравенства и операторы сравнения вы
01:04:00
можете перегружать оператор равно его
01:04:05
синтаксис вот такой оператор равно тут
01:04:09
какие-то параметры
01:04:10
оператор
01:04:13
не равно тоже какие-то параметры ну и
01:04:17
все остальные писать не буду больше
01:04:18
меньше меньше либо равно больше либо
01:04:20
равно все эти операторы вот старых
01:04:23
стандарты то есть в старых это
01:04:25
все что мне си плюс плюс 20 хотя все
01:04:28
плюс 20 же на самом деле они возвращают
01:04:31
bull а что эту сказал про си плюс плюс
01:04:33
27 + 20 есть оператор там срывы и
01:04:36
campari сон или 3 как это по-русски
01:04:40
сказать даже не знаю одинарный тырнет не
01:04:44
тернарный оператор
01:04:46
летающая тарелка
01:04:49
вот такая вот штука срыва и компрессом
01:04:52
оператор короче мы про него ничего
01:04:54
говорить не будем кому интересно
01:04:55
нагуглить а там можно перегрузить его
01:04:58
1-я компилятор сумеет там как ты вывести
01:05:01
все остальные мы этого делать не будем
01:05:04
мы по старинке попробуем по перегружать
01:05:07
разные операторы
01:05:09
напрямую да и посмотреть как такой тип
01:05:12
данных будет работать но давайте сделаем
01:05:14
сначала небольшой перерывчик я думаю там
01:05:17
минут
01:05:19
сколько
01:05:21
давайте минут так сейчас вот у меня 1218
01:05:26
тогда в
01:05:29
1225 это семь минут получится да
01:05:32
продолжим и попробуем по реализовывать
01:05:35
эти операторы на примере с деньгами
01:05:37
непосредственно в программе
01:11:52
так давайте продолжим
01:12:00
и попробуем что-нибудь
01:12:01
перегрузить
01:12:08
так
01:12:13
сказал я и задумался ну давайте создадим
01:12:16
новый проект
01:12:19
назовем его
01:12:23
types
01:12:27
сказал я и
01:12:30
не печатал что-то не туда так мы
01:12:33
создадим консольное приложение это
01:12:38
простейший тип того что нам нужно кстати
01:12:41
мне кажется прошлый раз мы точно также
01:12:43
делали и
01:12:44
назовем его types так поместим все в
01:12:50
одну и ту же папку потому что нам не
01:12:52
нужна
01:12:53
сложная структура
01:13:11
сотрем то что нам не нужна и
01:13:18
попробуем сделать
01:13:20
простенький
01:13:23
тип money
01:13:25
так классно не
01:13:29
собственно в нашей игре мы сказали будет
01:13:32
кстати обратите внимание что поскольку
01:13:34
все плюс плюс класс из тракт давность
01:13:37
поговорили это одно и то же до
01:13:38
соответственно мы можем создавать
01:13:41
well you типы либо при помощи классов
01:13:45
либо при помощи структур в целом это
01:13:48
одно и то же все упирается в
01:13:51
область видимости по умолчанию если это
01:13:55
класс тогда для того что будет паблик я
01:13:57
должен явно сказать что это паблик
01:13:59
собственно а
01:14:00
в структуре дабы не где то там правильно
01:14:03
придется написать правит и так но
01:14:05
последнее замечание но поскольку я все
01:14:08
равно всегда пишу public правило ты так
01:14:11
далее не полагаясь на область видимости
01:14:12
по умолчанию для меня по большому счету
01:14:14
разницы между классами структуры никакой
01:14:17
нет но за опять же моим внутренним
01:14:20
соглашением о семантике то есть если я
01:14:23
пишу класс я все-таки подразумеваю что
01:14:25
эта штука будет
01:14:27
использована как класс то есть для нее
01:14:30
будут переопределены например какие-то
01:14:33
операции или у нее будут какие-то методы
01:14:35
и так далее если я пишу что-то как
01:14:39
struck the я подразумеваю что этого
01:14:40
ничего не будет максимум там будет
01:14:43
только конструктор какой-то который
01:14:45
будет инициализировать поля может быть
01:14:47
даже не будет этого опять это
01:14:49
исключительно мои внутренние соглашение
01:14:51
зависимости от каких-то соглашений о
01:14:55
кодировании его можно она может быть
01:14:58
таким же либо нет так давайте значит
01:15:01
писать money у нас будет
01:15:04
паблик поля у нас будут проявит поля и
01:15:07
вот тут вот надо бы подумать вот над чем
01:15:10
а
01:15:11
нужны ли нам правят поля здесь или не
01:15:13
нужны у кого есть какие соображения по
01:15:17
этому поводу
01:15:19
ну точнее нужны ли нам правит поля и
01:15:21
геттер и сеттер и или ненужным не нужны
01:15:24
нам правят поля и геттер и сеттер и
01:15:30
это
01:15:33
вот тут вот вы сказали очень хорошую
01:15:36
историю если мы пишем хорошо а что такое
01:15:39
хорошо
01:15:42
отряда я-концепции всякий об этом
01:15:53
если мы например не деньги сделать
01:15:56
дробные то нам нужен какой-нибудь цептор
01:15:58
чтобы принимать правильный тип и и так
01:16:01
далее но если мы пишем картоном
01:16:04
публичные поляне ну да
01:16:05
это на самом деле супер провокационный
01:16:08
вопрос
01:16:09
и вся вот эта история с пропорциями
01:16:12
гитарами и секторами и
01:16:16
приватными публичными полями
01:16:19
очень спорно в том ключе вообще нужно
01:16:23
это или нет и хорошо это делать или нет
01:16:27
то есть типа классическое представление
01:16:29
или представлению там университетская
01:16:32
академик вот так его назовем его там
01:16:35
считаются что до поля должны быть
01:16:37
приватными и должны быть гитары и
01:16:39
сеттеры и короче и вообще а с другой
01:16:42
стороны есть люди которые
01:16:45
футов много лет что-то писали и у них
01:16:49
есть мнение абсолютно другое вот есть
01:16:50
такой товарищ его зовут джонатан блоу я
01:16:53
думаю многие про него слышали слышали
01:16:59
программирования нашел да он пишет свой
01:17:02
язык программирования j ой как раз
01:17:04
специально ориентированные на
01:17:05
разработчиков игр и он сам разработчик
01:17:10
игр очевидно написал создал такие игры
01:17:14
как braid with нас но там несколько
01:17:16
других и вообще это один из очень
01:17:19
активных
01:17:20
так скажем энди девелоперов и вообще
01:17:24
разработчиков у
01:17:26
которой есть очень править идей по
01:17:28
многим вопросам но опять же это с моей
01:17:31
точки зрения да то есть я бы себя если
01:17:33
вот так не к программистов разделить на
01:17:36
условные лагере да я бы вот таких людей
01:17:38
как майк актом джонатан блоу вирт и так
01:17:40
далее поместил бы в один лагерь и вот
01:17:43
так скромно бы к нему присоединился но
01:17:46
соответственно комитет по стандартизации
01:17:47
си плюс плюс и там людей которые любят
01:17:50
потоки в явы и страны другие страшные
01:17:52
вещи я бы отнес бы к другому лагерю и от
01:17:55
них бы отсоединился но просто смысл
01:17:58
такой что у всех есть какие-то взгляды
01:17:59
на то как это делать правильно да и вот
01:18:02
мой взгляд и я вам кстати скинут
01:18:06
запись стрима джонатана блоу про его
01:18:10
язык программирования это вон как раз
01:18:12
рассуждает вот про эту историю с
01:18:13
гитарами и сетами тоже посмотрите ему
01:18:15
тоже следующий раз
01:18:17
по обсуждаем эту тему так вот он считает
01:18:21
что в целом
01:18:23
когда вы пишете геттеры и сеттеры вы их
01:18:26
пишете типа с выростом на будущее да то
01:18:29
есть до когда-нибудь я захочу в
01:18:31
какой-нибудь из центров добавить
01:18:32
какую-нибудь проверку и так далее но тут
01:18:35
сразу возникает вопрос а когда то есть
01:18:38
вот сколько я раз не писал better off и
01:18:40
сеттеров не ни разу это не понадобилась
01:18:42
ни один из мои гитарах и сатаров кроме
01:18:44
как простой операции re-therm что-то в
01:18:47
гитаре и соответственно присвоить что-то
01:18:51
все три там this will you присвоить well
01:18:55
you do the объявит
01:18:56
никогда там никакого другого кода не
01:18:59
было как вы думаете у кого есть какие
01:19:02
идеи почему
01:19:03
но что в большинстве случаев поныне вот
01:19:07
в этом-то и суть а в тех случаях когда
01:19:09
это нужно сразу возникает вопрос а что
01:19:12
это за случае для чего вы хотите
01:19:14
проверять какие-то значения в секторе но
01:19:17
типа классика в секторе я хочу проверять
01:19:20
значение для того чтобы вы лидировать
01:19:23
данные дай чтобы инвариант моего класса
01:19:25
был не нарушить а давайте мы подумал вот
01:19:28
над каким вопросом вообще валидация
01:19:29
данных она должна находиться в центре
01:19:31
или это отдельная задача не будет ли это
01:19:34
вот наша история про separation of
01:19:36
concerns да когда каждый класс был
01:19:38
решать одну конкретную задачу
01:19:39
пересекаться с валидации и даже если не
01:19:42
будет как бы не
01:19:44
является ли валидация данных чем-то
01:19:47
внешним по отношению к этому классу да и
01:19:50
вот например есть такая штука как я
01:19:52
бывали дышим бен спецификация и она
01:19:55
говорит что ну на самом деле до является
01:19:58
если вы хотите вы лидировать бен вы это
01:20:00
должны делать не кодом который будет в
01:20:03
классе а при помощи специальных
01:20:04
механизмов да то есть вы можете например
01:20:06
там используют какие-то аннотации
01:20:08
отдельный класс который будет вы
01:20:10
лидировать ваш класс и enforced in
01:20:13
варианты которые вы хотите в нем при
01:20:16
помощи рефлексы ну и так далее так далее
01:20:17
то есть это там отдельная история но
01:20:19
фишка в том что на самом деле сколько бы
01:20:22
я чего-то мне писал некогда было не
01:20:25
нужно это делать непосредственно в
01:20:27
гитарах и в секторах а когда это там
01:20:29
было это зачастую еще и мешало потому
01:20:32
что вокруг этого приходилось как-то
01:20:33
пританцовывай до 5 классическая история
01:20:35
здесь реализации чего-то там когда вы
01:20:38
получаете там print джейсон из сети
01:20:41
здесь и реализуете его в bim ну или там
01:20:44
вот этот объект да кстати этот объект
01:20:45
есть такой шаблон называется dt data
01:20:48
transfer объект
01:20:49
соответственно это какая-то штука
01:20:51
которая предназначена для сериализации
01:20:53
10 реализацией так вот вы получаете
01:20:56
значение из сети и не дай бог в момент
01:20:59
диси реализации в де сереале затари у
01:21:00
вас какой-то property выкинет эксепшен
01:21:03
что типа значение некорректно вы не
01:21:06
сможете сформировать хороший ответ для
01:21:08
пользователя да потому что ну вот когда
01:21:10
вы заполняете его форму например на
01:21:12
сайте да вам надо сразу все ошибки
01:21:14
увидеть все поля которые были
01:21:15
неправильны соответственно надо чтобы
01:21:18
вам бен полностью 10 реализовался вы его
01:21:21
отдельно проверили проверили все ошибки
01:21:23
которые есть в полях и отдельно отослали
01:21:26
ответ ну совсем нет маши когда который
01:21:28
потом бы визуализировать и тут внезапно
01:21:30
получается что вы этого не можете
01:21:32
сделать потому что когда ди си
01:21:34
реализатор будет здесь реализовывать
01:21:36
первое неправильное свойство он
01:21:38
собственно выкинет эксепшен диси
01:21:40
реализация остановится потому что бен не
01:21:42
может быть созданную короче приплыли до
01:21:44
ваша задача будет попросту невозможно
01:21:46
решить в этой модели короче смысл такой
01:21:49
что надо очень четко понимать еще раз да
01:21:52
это ключевая мысль который через все
01:21:54
должно проходить что вы делаете зачем и
01:21:57
почему вы придете но в avi как я говорил
01:22:01
геттер и сеттер и нужны и вообще вот про
01:22:03
этот моушен property он нужен для того
01:22:04
чтобы внешние инструменты с вашим
01:22:07
классом могли работать там вам никуда не
01:22:09
деться и
01:22:11
все плюс плюс если у вас есть у property
01:22:14
до в unreal engine и вам собственно
01:22:16
никто ничего не на генерирует вам что-то
01:22:19
придется писать но часто надо понимать
01:22:21
зачем вы это делаете вот здесь я понимаю
01:22:24
что мне это не нужно поэтому я сотру вот
01:22:26
эту штуку паблик и не буду писать день
01:22:28
тарифы сеттеров никуда а просто буду
01:22:31
работать с
01:22:33
да я сейчас объясню зачем я это сделал
01:22:36
давайте пока пишу кто-нибудь объясните
01:22:39
зачем я это сделал
01:22:45
может быть сказать о собственно и
01:22:47
соглашение которое помогает отделить все
01:22:50
поля от методов именно так то есть это
01:22:54
моя внутренняя историю которую я
01:22:56
использую для того чтобы логически
01:22:58
разделять секции которые есть в
01:23:01
определении класса естественно это не
01:23:03
нужно по синтаксису потому что все что
01:23:05
public до до конца класса или до
01:23:07
следующего модификатора доступа будет
01:23:12
таким же или обладать той же самой
01:23:14
областью видимости ну вот у меня есть
01:23:16
внутренние соглашение что я логически
01:23:17
разделяю члены класса как минимум методы
01:23:20
и
01:23:21
данные
01:23:22
модификатором просто потому что мне так
01:23:25
нравится
01:23:27
да я тут решил в прошлый раз я написал
01:23:30
pensee chez les pins и слов как вот
01:23:32
некрасивый да поэтому я назову то что на
01:23:35
что меняются наши дублоны с интимными
01:23:37
так все погнали соответственно money
01:23:40
значит мане и
01:23:42
[музыка]
01:23:43
дынц
01:23:46
я себе максимально облегчить кстати
01:23:49
обратите внимание на по всяким в угловым
01:23:52
соглашением члены класса рекомендуется
01:23:54
делать вот так но поскольку я хочу ли я
01:23:57
сделал эти члены класса публичными вот
01:24:00
эта нотация выглядит очень искусственный
01:24:02
да и поэтому я этого делать не буду
01:24:05
собственно все
01:24:09
свойств
01:24:11
вы получаете то что вы делаете поля
01:24:13
публичными вы нарушать инкапсуляция
01:24:16
свойства но частности геттер как раз
01:24:19
таки на же чтоб сохранить этого
01:24:20
инкапсуляции чтобы приватное поле
01:24:22
вынести только на чтение
01:24:25
центрами согласно я только не пользует
01:24:27
налог именно гидр публичные он часто
01:24:30
используется для согласен с вами и как
01:24:34
раз я еще раз говорю вы должны понимать
01:24:37
для чего вы это делаете да и более того
01:24:39
я же не говорю что надо всегда это делаю
01:24:42
да то есть для всех классов делать все
01:24:44
поля публичными это тоже совершенно не
01:24:46
так потому что действительно у класса
01:24:47
могут быть приватные поля например это
01:24:50
такие поля которые зависят от но на
01:24:53
который действительно будет в них будет
01:24:54
внешней вариант и которые будут зависеть
01:24:57
друг от друга я кстати в прошлый раз
01:24:59
пример не сумел привести а вот всего
01:25:01
диета пример придумал да вот например у
01:25:03
нас будет вектор и у векторы будет его
01:25:06
размер соответственно естественно и
01:25:08
буфер которым вектор управляет и размер
01:25:10
этого буфера они естественно будут
01:25:12
приватными потому что мы не можем
01:25:14
допустить чтобы пользователь их вот так
01:25:15
вот менял и оставил класс не
01:25:17
согласованном состоянии потому что то
01:25:18
классы щеткин вариант и вот как раз то
01:25:21
что вы говорите про guitar если у
01:25:23
векторы есть сайт этот сайт может быть
01:25:25
только приватным и он может быть только
01:25:28
readonly потому что мы ну как бы его
01:25:30
отдаем и все если же мы его делаем и
01:25:33
через сеттер то есть я хочу делать сад
01:25:35
сайт но это центр будет что-то делать он
01:25:37
будет рио лоцировать буфер да то есть
01:25:39
это не будет просто присваивать и
01:25:41
поэтому это действительно будет вот
01:25:42
такое вот свойство все это все верно но
01:25:45
в данном контексте это абсолютно не так
01:25:49
это просто какие-то два числа они даже
01:25:51
между собой то на самом деле очень слабо
01:25:53
связаны там есть конечно рассуждение что
01:25:56
дублоны могут принимать какие-то
01:25:59
конкретные значения и не могут быть
01:26:01
отрицательными например ну и сайте мы не
01:26:03
могут быть там например отрицательными
01:26:06
они не могут быть больше ста и вот это
01:26:08
вот можно вот эти два инварианты можно
01:26:12
заставить соблюдать как раз геттер и
01:26:16
сеттер но
01:26:18
возможно там вот в этом контексте это
01:26:20
будет и искусственным а возможно не
01:26:22
будет ну то есть смысл такой что еще раз
01:26:25
повторю эту мысль и надо очень четко
01:26:27
понимать для чего это делается да то
01:26:30
есть мне кажется что в данном конкретном
01:26:32
контексте в данном конкретном примере
01:26:34
это излишне да и поэтому я этого делать
01:26:37
не буду но если вам кажется что это не
01:26:39
так и вы четко понимаете почему да то
01:26:42
тогда вы действительно можете это
01:26:44
сделать ну это же самое вот это power
01:26:48
конвертировать важно выдавали например
01:26:50
420 70-ти move мы сразу 400в дублоны
01:26:53
перегнали а 270 поставили да это кстати
01:26:57
отличная тему я только хотел сказать про
01:27:00
эту историю что я сказал что сантимов не
01:27:02
может быть больше ста но на самом деле
01:27:04
действительно может и весь вопрос как
01:27:07
это делать вы можете в мане присвоить то
01:27:10
есть если у вас есть сет центр вот то
01:27:12
что вы предлагаете действительно сразу
01:27:14
же конвертировать внутри этого сектора
01:27:15
дублонов сантима но либо я могу ввести
01:27:18
какой-нибудь метод типы нормала из
01:27:20
который будет собственно дублоны
01:27:22
переводить сантима это отличное
01:27:24
замечание и спасибо что вы его сказать
01:27:27
но еще раз да мы четко понимаем что и
01:27:29
зачем мы дело но
01:27:32
сейчас я уже не понимаю что я зачем я
01:27:35
делаю короче
01:27:38
короче вот
01:27:40
так
01:27:41
чем у меня тут есть у меня есть уже в
01:27:44
конце концов монин давайте мы с этими
01:27:46
мане мы чего-нибудь сделаем
01:27:48
что мы с ними будем делать мы и будем
01:27:51
для начала сравнивать от для этого мы
01:27:55
перегрузим оператор сравнения тут есть
01:27:57
подводный камень связанный в общем
01:27:59
операторы можно перегружать внутри
01:28:01
класса эти операторы будут членами
01:28:03
класса а можно перегружать отдельно от
01:28:06
класс и тогда они будут ну типа
01:28:08
свободными функциями да они будут рядами
01:28:10
класса и
01:28:12
будут принимать если это член класса там
01:28:16
один аргумент до второй аргумент будет
01:28:17
неявно собственно указатель на класс из
01:28:19
а если это свободная функция да тут он
01:28:22
будет принимать оба аргумента и тогда ну
01:28:25
принято что
01:28:27
опять же не жестко но в большинстве
01:28:30
соглашений да в том числе я также делаю
01:28:32
что если этот оператор не модифицируют
01:28:37
сам экземпляр класса то есть это не
01:28:38
оператор типа плюс присвоить час но тоже
01:28:41
такой оператор напишем то тогда вполне
01:28:43
можно и
01:28:45
там
01:28:47
даже будет лучше вот так скажу сделать
01:28:49
его свободной функции собственно
01:28:51
оператор плюс я перегружу вот таким вот
01:28:53
образом и так это значит мания
01:28:57
оператор плюс
01:29:00
оператор плюс и два параметра мания
01:29:04
кстати по поводу имён этих параметров
01:29:07
очень
01:29:08
много всяких идей одно из соглашений это
01:29:12
вот такое и наш сыр hs то такое лишь srh
01:29:17
с
01:29:23
лавкой
01:29:25
не только не шейка сайт left-hand side и
01:29:28
right-hand side это собственно
01:29:30
левая сторона и правая сторона да это то
01:29:35
что есть вокруг бинарного оператора лево
01:29:38
аргументы право аргументы по английски
01:29:40
вот они так называются опять же
01:29:42
можно называть как угодно да в 122 там
01:29:46
все что угодно но вот очень часто
01:29:48
используют именно вот эти два сокращения
01:29:50
просто потому что так что мы делаем мы
01:29:53
возвращаем значит новая мания которые
01:29:56
будут
01:29:57
так lhs
01:30:00
дублоны плюс дублоны
01:30:06
вот пока я пишу скажите все уже поняли
01:30:09
как бы что я делаю скажите какая здесь
01:30:12
есть проблема
01:30:19
то что вы and hands and hands
01:30:22
выкладывать да это отличная проблема
01:30:25
кстати спасибо
01:30:26
но это получилось случайно на нас опять
01:30:30
нет конвертация main вариант пожарного
01:30:33
да мы сейчас тут с вами внезапно
01:30:36
договорились что так rhs . затем
01:30:42
копируем ваше совершенство до складываем
01:30:45
копируем мы их да сейчас про это
01:30:49
поговорим это сложно хорошее замечание
01:30:50
не на таком ссылки сделать вот сейчас мы
01:30:54
про это поговорим как раз но проблема не
01:30:57
в этом проблема в том что сейчас деньги
01:30:59
будут не нормализованном состоянии да
01:31:03
это как раз вот то о чем я тут говорил
01:31:05
что мы можем заставить чтобы класс был
01:31:09
согласованном состоянии а можем
01:31:11
заставить чтобы нет и в принципе на
01:31:15
самом деле это с точки зрения программы
01:31:18
абсолютно неважно да но там понятно что
01:31:20
отрицательные числа это плохая история
01:31:22
но в целом вот здесь в данный момент
01:31:26
абсолютно неважно нормализованные
01:31:28
дублоны и сантим или нет потому что
01:31:30
операции сложения и вычитания все равно
01:31:32
будут работать наверное усложнение
01:31:34
совершенно точно правильно вот вычитание
01:31:36
надо подумать так и чтобы вот такого
01:31:39
безобразия у нас не было мы с вами
01:31:41
сделаем вот такую вот функцию норм
01:31:44
давайте сделаем ее
01:31:47
очень хитрый сигнатурой мания норм
01:31:53
сейчас мы кстати
01:31:56
подвинет вот эту штучку до
01:31:59
соответственно на будет нормализовать
01:32:01
дублоны из интим и да и делать так чтобы
01:32:04
снять и мы всегда были диапазоне от 0 до
01:32:06
100 а дублоны были ну понятно в каком
01:32:09
диапазоне так money собственно
01:32:22
мне норм есть вообще хранить дублоны или
01:32:26
мы предполагаем что потом возможно
01:32:28
какая-то коррекция курса то есть
01:32:31
несколько полок в 99
01:32:34
например так продолжите вашу идею
01:32:39
к тому что сейчас мы можем просто все
01:32:42
хранить сантима ха ну на запрос дубов
01:32:46
просто возвращать с интимом деленный на
01:32:48
стол вот это отличная история но вы
01:32:52
опередили паровоз немножко я хотел пред
01:32:54
хотим мы например сделать так чтобы курс
01:32:57
дублонов сантимов варьировался и в
01:33:00
какой-то момент например пол стоило ли
01:33:02
способ team of a 99 там были 101 но удар
01:33:06
на самом деле в этом великого смысла нет
01:33:09
и действительно было бы более правильно
01:33:11
хранить одно поле сентимо и каждый раз к
01:33:14
нам нужно дублоны просто-напросто там
01:33:16
делить на 100 и убрать из леса ставкам и
01:33:19
остаток от деления да и выделять дублоны
01:33:22
и сантим и это бы все супер сильно
01:33:23
упростило и как раз в самом конце хотел
01:33:26
про это сказать но всплывай раньше
01:33:30
будет будем знать что мы делаем не
01:33:33
совсем та ну и ладно так давайте зато
01:33:37
придумаем как мы будем нормализовать
01:33:39
значение
01:33:42
так как мы это будем делать
01:33:47
если у нас с энтим и
01:33:50
больше ста как нам выделить сколько там
01:33:54
дублонов надо по факту то что вы сейчас
01:33:56
сказали да только немножечко в таком вот
01:34:00
виде там энди это
01:34:03
сентимо поделенное на то вот таким вот
01:34:08
образом а сами с энтими
01:34:14
это
01:34:16
те же самые сантим и
01:34:20
поделенные на
01:34:22
100 вот таким вот образом собственно вот
01:34:25
эта операция остаток от деления да вот
01:34:27
это вот д это получается там целая часть
01:34:30
так и теперь надо эти дублоны
01:34:34
обновить нам даже не нужна эта
01:34:36
переменная мы просто
01:34:39
прибавим к дубло нам
01:34:42
с этим и поделенные на 100 вот таким вот
01:34:45
образом так все согласны с этой штукой
01:34:53
не знаю согласен ли я ну узнаем так
01:34:57
returns из теперь обратите внимание вот
01:35:01
на такую странную конструкцию что мы
01:35:03
сделали мы сделали
01:35:08
функцию которая возвращает ссылку на
01:35:11
некоторый объект money и в самом конце
01:35:14
мы вернули сам объект это делается для
01:35:19
того чтобы можно было построить так
01:35:21
называемый fluid интерфейс то есть вы
01:35:24
каждый раз возвращаясь из возвращая из
01:35:28
объекта ссылку на самого себя можете
01:35:31
продолжать вызывать его методы для того
01:35:34
чтобы производить несколько операций
01:35:36
последовательно сейчас мы попробуем это
01:35:38
сделать здесь поскольку мы хотим чтобы
01:35:40
оператор плюс у нас всегда возвращал
01:35:42
деньги в нормализованы виде да мы можем
01:35:45
это сделать ну либо вот таким вот
01:35:48
образом
01:35:50
так
01:35:54
маней м
01:35:56
присвоить
01:36:00
вот эту вот штуку насыщают спросить
01:36:03
может быть почтил вас в этой функции
01:36:06
нормализации название этой функции там
01:36:09
вот тип от его твое . как-то это значит
01:36:12
вот это вот штука это оператор
01:36:14
разрешения контекста который говорит что
01:36:16
функция норм вот эта вода относится к
01:36:19
классу money вот этому вот то есть вот
01:36:21
это у нас тип возвращаемого значения вот
01:36:24
это вот класс или то пространство имен
01:36:26
до в котором объявлена функция и это сок
01:36:29
сама функция
01:36:31
то есть подпишем и потому что не всем
01:36:33
интересно
01:36:35
если мы это сделали здесь мы бы просто
01:36:38
написали открывающую закрывающую скобку
01:36:40
и собственно эту штуку написали бы здесь
01:36:44
подчеркивают
01:36:46
обнажающий вопрос на уши не нужен и фру
01:36:50
в нормализации на самом деле не нужен да
01:36:52
потому что мы в любом случае если
01:36:55
сантима меньше нуля мы получим 0 и будем
01:36:58
складывать с нулем а тут получим то же
01:37:00
самое это абсолютно так но я его оставлю
01:37:02
просто для ясная за то есть она мне даже
01:37:05
до нормализации мы сможем сэкономить
01:37:07
одну операцию ну это тут супер спорно
01:37:10
чему на экономим на самом деле потому
01:37:12
что
01:37:14
но
01:37:16
сразу надо спуститься на уровень железа
01:37:18
и подумать о что при этом произойдет до
01:37:21
при этом призойти может произойти
01:37:25
работа процессора с работы блока
01:37:29
предсказания ветвлений в процессоре
01:37:31
загрузки всяких странных буферов
01:37:33
вычислений всяких странных значений и
01:37:35
так далее и в целом у даже и предсказать
01:37:37
не сможем что будет эффективнее да
01:37:39
поэтому ну короче оставим как есть
01:37:42
то есть это экономия может оказаться на
01:37:46
современных супер скалярных процессорах
01:37:49
очень странным и непредсказуемым делом
01:37:52
так а мы давайте вернемся вот сюда и
01:37:57
разорить о нем этот самый норм
01:38:00
так только нет это вот этот м . нормы
01:38:04
вот таким вот образом ну и все то есть
01:38:09
мы могли бы сделать так а могли бы
01:38:11
сделать поскольку мы вернули но кстати
01:38:14
это уже нам помогло да то есть мы из
01:38:17
функции money вернули норм то есть если
01:38:19
бы у нас этого не было до давайте
01:38:21
наверное сразу
01:38:23
сначала напишу вот таким вот образом
01:38:25
если бы у нас функция норм которая
01:38:28
казалось бы не должна возвращать
01:38:29
никакого значения она действительно ну
01:38:32
как бы логически не этого не делает мы
01:38:34
бы тогда мне писали вот так что мы
01:38:36
получили money потом его отдельно
01:38:38
нормализовали да а потом вот мы сделали
01:38:40
ри черный но поскольку мы использовали
01:38:44
вот этот трюк который все плюс плюс
01:38:46
очень часто применяется собственный
01:38:48
returns именованный зыс и вот эту штуку
01:38:50
по ссылке да то тогда мы можем
01:38:53
во-первых написать вот так как я сначала
01:38:55
написал стал немножечко лучше а
01:38:58
во-вторых мы бы могли написать вот так
01:39:01
сейчас узнаем вообще могли бы или нет
01:39:03
никогда так не пишу
01:39:08
но по всей видимости могли бы смысл
01:39:12
такой почему кстати так никогда не пишу
01:39:14
потому что тут абсолютно непонятно что
01:39:16
происходит да то что вы что-то создали
01:39:19
вы у этого чего-то чё ты вызвали то есть
01:39:22
ну как бы произошло происходит понятно
01:39:24
но абсолютно не читаем ада поэтому
01:39:26
большинство стиля кодирования вот прямо
01:39:28
запрещают вот так писать но как so4
01:39:31
низкая то можно и
01:39:34
конструкторе в конструкторе можно это
01:39:38
сделать но мы не будем то есть в целом
01:39:41
наверное проще на
01:39:47
так еще вопросы замечания вроде бы все у
01:39:51
нас тут получилось давайте попробуем в
01:39:53
конце концов уже что-нибудь посчитать
01:39:56
так меня есть вот такие мани мани
01:40:00
м соответственно
01:40:04
давайте три вида инициализации сразу же
01:40:08
запишем вот такая инициализация мы уже
01:40:11
умеем и и делать да потому что вы делали
01:40:14
в дублонах например один дублон и 25
01:40:17
сантимов 2 инициализация через
01:40:21
конструктор money м но на самом деле
01:40:24
здесь тоже как бы через конструктор
01:40:26
только синтаксис немножко странной так
01:40:29
money м
01:40:31
допустим 2 дублона и 50 сантимов вот так
01:40:35
это напишу и
01:40:36
последнее это модное нынче введенные
01:40:41
последними стандартами но тоже там чтоб
01:40:43
с 11 наверное универсальная
01:40:45
инициализация сейчас ее и все геи все
01:40:48
очень пользуются я ее очень не люблю но
01:40:50
тем ни менее да это инициализация вот
01:40:53
такого вида 3 дублона например и 15
01:40:57
сантимов когда мы параметры конструктора
01:40:59
можем записывать фигурных скобках это
01:41:02
называется универсальной инициализацией
01:41:04
там можно инициализировать ну вот так
01:41:07
вызывая конструктор вызывая специальные
01:41:09
виды конструктор через ниши лазер лист
01:41:11
мы про это наверное говорить не будем но
01:41:13
кому интересно погуглите примешалось
01:41:15
earliest ну ладно ну супер france потом
01:41:17
покажу когда дойдём так и просто вызов
01:41:21
дефолтного конструктора магии который
01:41:24
генерируется калькулятору
01:41:26
дефолтный конструктор вы вызовете когда
01:41:29
пустые фигурные скобки укажите и тогда у
01:41:32
вас будет вас вызвал дефолтный
01:41:34
конструктор
01:41:37
если мы удалим сейчас дефолтный
01:41:39
конструктор это с штока тоже должна
01:41:41
взводится смысле у меня нет дефолтного
01:41:43
конструкторы у
01:41:46
меня есть мой конструктор который
01:41:48
принимает два аргумента у меня нету
01:41:50
конструкторы без параметров не понял
01:41:55
короче смысл такой что я люблю делать
01:41:59
вот так вот это я максимально делать не
01:42:03
люблю но это сейчас модно и в основном
01:42:06
делают вот так ну а вот это это такой
01:42:09
промежуточный способ который
01:42:14
похож на то что происходит например в
01:42:17
java или в код виню а почему они и не
01:42:20
использовать в первом случае вот это
01:42:23
отличный вопрос и
01:42:27
ну ладно весь вопрос в какой момент вы
01:42:30
про это рассказать давайте тогда сейчас
01:42:33
проекта расскажу
01:42:36
поскольку
01:42:38
все равно нам это нужно короче идея
01:42:41
заключается в общем что
01:42:44
все + +
01:42:47
сейчас мы это рассмотрим чуть чуть на
01:42:50
более примитивном уровне чем это есть и
01:42:52
это будет больше похоже на то что
01:42:54
происходит в
01:42:57
сишарпе и в яви но тем не менее и так
01:43:00
все плюс плюс у нас по факту каждый раз
01:43:04
когда вызывается функция или когда
01:43:06
выполняется программа а мы знаем что
01:43:08
программы все плюс плюс выполняется
01:43:10
через вызов функции main
01:43:13
итак у нас есть функция main в этой
01:43:16
функции есть какие-то операторы там они
01:43:19
что то делают и далее у нас из функций
01:43:23
main могут вызываться другие функции так
01:43:26
вот для того чтобы
01:43:27
поддерживать вызов функций а под
01:43:31
поддержку вызову функцией я под
01:43:33
поддержкой вызова функции я понимаю две
01:43:35
вещи первая вещь то что функции могут
01:43:37
быть локальные данные да это локальной
01:43:39
переменной которую мы объявляем в ее
01:43:41
теле вот здесь вот все эти три мании это
01:43:43
собственно локальные данные ну правильно
01:43:45
там ходить m1 m2 m3 но сейчас я это тоже
01:43:48
сделаю так далее и второе это
01:43:52
поддержать непосредственном вызов
01:43:55
функции потому что когда функция
01:43:57
выполняется да там осуществляется
01:43:58
переход на то место памяти в которой она
01:44:01
храниться собственно там что-то
01:44:02
происходит она возвращается на так вот
01:44:05
для вот этих двух целей с функцией
01:44:07
связан стек это специальная область
01:44:10
памяти в которой хранятся локальные
01:44:12
переменные
01:44:15
то есть вот в функции main есть стеку
01:44:18
функции f есть стек и мы попозже узнаем
01:44:21
что на самом деле это один и тот же стак
01:44:23
только очень хитрый используется далее
01:44:26
что происходит размер стека или точнее
01:44:30
это правильно называется кадром стайка
01:44:32
стек фрейм
01:44:35
так когда вызывается функция в стеке
01:44:39
астык он там как я сказал общей
01:44:41
выделяется штука которая называется стек
01:44:44
фрейм это область т.к. которая нужно
01:44:46
непосредственно для вызова конкретные
01:44:48
функции
01:44:49
так стык фрейм и размер это вас так
01:44:52
фрейма определяется компилятором исходя
01:44:56
из описания функции то есть вот эта
01:44:58
функция main она содержит объявление
01:45:02
трех переменных им 1 м2 и м3 потом
01:45:07
проставлять соответственно для того
01:45:10
чтобы хранить 1 м 1 ну хранить m1 m2 m3
01:45:15
нам нужно некоторое количество байт это
01:45:17
количество байт определяется исходя из
01:45:19
размера
01:45:21
полей который в этом классе хранятся вот
01:45:24
здесь у меня хранятся два in the значит
01:45:26
будет количество байт необходимое для
01:45:28
хранения 2 end of на самом деле
01:45:30
компилятор может составлять по 1 где то
01:45:32
есть дополнительные байты для
01:45:34
выравнивания данных и для более сложных
01:45:38
классов вот это рассуждения просто
01:45:40
складывать значение для полей может и не
01:45:42
работать он на самом деле может не
01:45:43
работать и тут если компилятор захочет
01:45:45
выровнять все на границу четверного
01:45:48
слова до восьми байт поэтому все + + и
01:45:51
все есть вот такой вот оператор сайтов
01:45:53
который позволяет вычислить и вычислить
01:45:57
размер соответствующего класса да то
01:46:00
есть мы можем написать вот так сразу of
01:46:02
money можем написать вот так союзов м
01:46:05
это
01:46:07
размер конкретной переменной но
01:46:09
поскольку
01:46:11
союзов является оператором его можно
01:46:14
писать без скобок но я вот люблю
01:46:15
например писать вот в таком вот виде со
01:46:17
скобками то есть м это количество байт
01:46:19
который потребуется на хранение это вам
01:46:21
они так вот возвращаясь к этому стеку
01:46:25
кадр стека соответственно размер кадры
01:46:28
стека зависит от всех
01:46:30
размеров всех локальных данных которые
01:46:33
есть функции
01:46:35
параметров этой функции сейчас умей на у
01:46:37
нас параметров нет но они на самом деле
01:46:39
есть поэтому они могут быть тоже там за
01:46:41
lacie раваны определенным образом и плюс
01:46:43
еще некоторые служебные данные которые
01:46:45
нужны компилятору и который размеры этих
01:46:48
данных естественно знает и поэтому
01:46:50
каждый раз когда вызывается функция в
01:46:53
стеке лоцируется кадр с размером
01:46:56
известным на момент компиляции и самое
01:47:00
главное это происходит очень быстро но
01:47:03
практически мгновенно то есть аллокация
01:47:05
памяти в стеке бесплатно и
01:47:07
поддерживается аппаратурой потому что
01:47:09
аппаратура естественно знает что есть
01:47:12
функции их надо каким-то образом
01:47:13
вызывать поэтому если так ладно вот так
01:47:18
вот соответственно все локальные
01:47:20
переменные которые у вас есть в
01:47:22
программе они размещаются внутри этого
01:47:25
кадры стека то есть где-то вот в этом
01:47:27
кадре стека будет м1 где-то внутри этого
01:47:30
кадра стэка будет м2 и где-то внутри
01:47:32
этого кадры стека будет м3 все те
01:47:35
переменные которые
01:47:37
вот они у нас есть
01:47:39
теперь про выделение памяти под них она
01:47:43
бесплатная кадр стека выделен переменные
01:47:47
там автоматические разместились никаких
01:47:49
дополнительных действий в ран тайме
01:47:51
делать не нужно да но это одно действие
01:47:53
еще раз выделение кадров выделение
01:47:55
памяти под кадр стека бесплатная
01:47:58
поддерживается аппаратурой далее
01:48:02
помимо стыка у программы написан на си
01:48:05
плюс плюс ну кроме там все всего прочего
01:48:08
мы про все прочее тоже поговорим еще
01:48:10
есть такая у вас памяти которая
01:48:12
называется кучей или динамической
01:48:14
памятью так вот нарисуем хип
01:48:17
соответственно куча
01:48:20
это специальная область памяти которую
01:48:23
программу в момент своего запуска просят
01:48:25
в операционной системы и отдает в
01:48:28
управлении специальные части эта часть
01:48:30
или там специально библиотеки и эта
01:48:34
часть или библиотека находится в ран
01:48:36
таймер если кстати запускали
01:48:38
когда-нибудь игры или инсталлировали
01:48:40
когда-нибудь игры видели что у вас при
01:48:43
инсталляции появляется в windows и в
01:48:47
диспетчере программ или как он там
01:48:49
сейчас называется эдуар ему в programs
01:48:50
такая штука как визул сипло сплошь
01:48:53
runtime бла-бла-бла такой-то версии да и
01:48:55
там каждая игра еще ставит свою версию
01:48:57
этого самого runtime так вот когда вы
01:48:59
запускаете такую игру но ему кстати
01:49:02
программы когда запускаем потому что
01:49:03
визу studio тоже ставит все плоского sun
01:49:05
time соответственно запускается часть
01:49:07
этого самого runtime а и внутри этого
01:49:09
runtime и при запуске операционной
01:49:10
системы завтра это какое-то количество
01:49:13
памяти под хип и запускается менеджер
01:49:15
этого самого hippo менеджер динамической
01:49:17
памяти
01:49:19
хит менеджер или данными камере менеджер
01:49:23
и мы с вами на последнем занятии будем
01:49:26
рассматривать как такой домик memory
01:49:28
менеджер устроим тайны миг
01:49:33
memory
01:49:35
менеджер
01:49:37
так что происходит дальше а дальше вы по
01:49:42
мере необходимости
01:49:43
из этого данными коимбре менеджера
01:49:45
можете отрезать столько байт памяти
01:49:46
сколько нужно вам под хранения данных
01:49:49
вот например ту же самую переменную m вы
01:49:51
можете в для ту самую динамическую
01:49:54
память поместить при помощи специального
01:49:56
синтаксиса языка си плюс плюс а именно
01:49:59
вызова оператора new вот таким вот
01:50:01
образом что при этом происходит при этом
01:50:04
происходит обращение к
01:50:07
memory менеджеру кстати у него второе
01:50:09
название всплыла не сказал это мемориал
01:50:12
локатор это тоже самое
01:50:16
море локатор
01:50:20
вот оператор new обращается к мемориала
01:50:23
катару чтобы выделить в хеппи
01:50:26
динамической памяти столько байт сколько
01:50:29
вы у него попросили количество байт в
01:50:31
вычисляются через сайтов тоже
01:50:33
компилятором момент компиляции с этим
01:50:35
все просто но вот чтобы найти этот блок
01:50:38
памяти в хеппи который можно вам
01:50:40
выделить и вернуть динамик но имре
01:50:42
менеджеру требуется выполнить алгоритм
01:50:44
поиска причем достаточно сложный и
01:50:47
достаточно тяжелый и поэтому любая
01:50:50
аллокация памяти все плюс плюс эта
01:50:52
операция по времени очень тяжелая и
01:50:54
затратная и соответственно каждый раз
01:50:57
когда вы пишете new вы вместо ну вы
01:51:00
получаете
01:51:01
очень дорогую операцию аллокации или
01:51:04
распределение динамической памяти вместо
01:51:06
бесплатной операции когда вы что-то там
01:51:09
распределяете на стыке понятно что
01:51:15
есть ситуация когда без этого не
01:51:17
обойтись мы тоже пройти ситуации
01:51:19
поговорим про некоторые даже сегодня
01:51:21
если успеем надеюсь успеем
01:51:24
но это такое необходимое зло
01:51:27
вопрос насколько необходимо вот если
01:51:30
внимательно послушать майка акта но он
01:51:31
про это тоже говорил он сказал что у них
01:51:33
есть куча они не используют стандартный
01:51:35
локатор да и они используют кучу своих
01:51:38
собственных и локаторов каждый из
01:51:39
локаторов под свои нужды потому что они
01:51:41
могут оптимизировать алгоритм поиска вот
01:51:43
этого самого свободного блока это первая
01:51:46
проблема вторая проблема заключается в
01:51:48
deal акации так вот с dea локацией
01:51:51
ситуация совсем печальная до что
01:51:55
все что вы попросили из динамической
01:51:58
памяти при помощи new вы должны из этой
01:52:00
даме ческой памяти обязательно вручную
01:52:02
удалить при помощи дэвид про это мы
01:52:04
говорили в прошлый раз если вы забудете
01:52:06
это и сделать то вы получите стандартную
01:52:09
проблемы все плюс плюс утечки памяти
01:52:11
это на самом деле не так страшно как про
01:52:15
это говорят в случае коротких программ
01:52:17
то есть если я вот своем и не забуду
01:52:20
сделать делиться чего-то там то ничего
01:52:23
не произойдет потому что эта память
01:52:24
будет вернуться операционной системе и
01:52:27
как будет все хорошо но если это
01:52:31
произойдет например во время манги и
01:52:33
лупа в вашей игре то есть вы будете на
01:52:35
каждый фрейм аллоцировать какое-то
01:52:37
количество байт а это кстати очень
01:52:39
прикольно и рассуждение давайте мы его
01:52:40
проведем вот у нас есть игра которая
01:52:43
rendered картинку со скоростью 60 фпс
01:52:46
при этом у нас есть проблема эта
01:52:50
проблема называются утечка памяти
01:52:51
по-английски моим relic
01:52:55
допустим вы на один кадр
01:52:59
что-то там накосячили и потеряли ну
01:53:04
допустим
01:53:05
чтобы было проще считать над какую
01:53:08
степень двойки взять давайте мы потеряем
01:53:10
32 байта ну по факту вот
01:53:15
пару классов маня
01:53:17
вопрос сколько памяти вы потеряете за
01:53:20
час
01:53:28
32 на 60 на 60 сколько это будет а
01:53:33
это если наши 10 секунду берутся надо
01:53:38
свернуть то есть вы в секунду нет это
01:53:42
тут мне кажется еще надо умножить это вы
01:53:43
в минуту столько потеряете
01:53:47
больше здорово килобайт вот смотрите тут
01:53:51
получается так что 32 байта мы потеряли
01:53:54
за кадр значит в секунду мы потеряем 32
01:53:57
на 60 в минуту мы потеряем 32 на 60 на
01:54:00
60 6 гигабайт вот а в час мы потеряем
01:54:04
вот так за один час мы потеряем примерно
01:54:07
60 мегабайт теперь история но ходят
01:54:12
слухи да что когда тестируют ваши игры в
01:54:14
microsoft и хотя как они тестировали
01:54:16
киберпанк никто не знает до этого тельно
01:54:19
печальная история так вот тот же
01:54:20
джонатан блоу на одном из на одной из
01:54:23
конференций как раз про стабильности игр
01:54:25
говорил что когда они тестировали свой
01:54:27
бренд для xbox 360 игра там есть
01:54:31
формально и требования и игра должна
01:54:33
работать без перерыва в течение трех
01:54:35
суток соответственно мы умножаем все вот
01:54:38
это безобразие 60 мегабайт на 3 и на 24
01:54:44
сколько памяти мы там потеряли уже
01:54:51
мог у четырех гигабайт примерно я там не
01:54:56
знаю но то есть надо посчитать до я
01:54:58
собственно верю вашим расчетам это
01:55:00
четыре гигабайта ну похоже на правду ну
01:55:03
нормально да то есть естественно у
01:55:04
иксбокс 300
01:55:08
пока
01:55:10
но для пока на сердце из них не так
01:55:13
страшно конечно если выпадет гигабайта
01:55:17
там попал гигабайта будет 0 5 гигабайт
01:55:21
но короче ладно это
01:55:23
посчитаете сами пусть будет даже 500
01:55:27
мегабайт но фишка в том что оно иксбокс
01:55:30
360
01:55:31
всего 512 мегабайт памяти насколько я
01:55:35
помню можно тоже глядь ну да не суть
01:55:37
короче смысл того что в этот момент
01:55:40
вашей да даже нам друга раньше ваша игра
01:55:43
крошиться и естественно ну сначала она
01:55:46
пока она начнет тормозить потому что
01:55:47
начнет swapping и все прочие да
01:55:49
естественно не хотите терять я то вы
01:55:51
заметите во время кадры теряете 32 байта
01:55:54
если вы больше теряет то есть смысл
01:55:56
такой что в программах которые запущены
01:55:58
один раз это не страшно и все говорят
01:56:01
вот мы мылись туда-сюда но надо понимать
01:56:02
да как масштаба то а вот в нашем случае
01:56:05
когда это дело выполняется на каждый
01:56:08
кадр в мангейм лупи это очень страшно
01:56:10
потому что любая потеря памяти в
01:56:12
конечном итоге приведет к тому что вы
01:56:14
сначала начнёте тормозить потому что
01:56:16
включится своп да и вот все что вы там
01:56:18
на теряли будет сначала выгружаться на
01:56:21
диск а потом как в конце концов когда
01:56:23
евреи загружать будет негде собственно
01:56:26
все крошиться на этом ваши игроки будут
01:56:30
писать на форум и какие вы прямо руки
01:56:32
разработчики и все как это обычно бывает
01:56:34
смысл такой что ручное управление
01:56:37
памятью это прекрасная игра блюда и
01:56:40
везде где только можно его тоже стоит
01:56:42
избегать и написание специальных и
01:56:44
локаторов это как раз один из способов
01:56:46
это дело избежать второй способ это
01:56:48
избежать это использование умных
01:56:50
указателей я вам помните но не вчера в
01:56:53
прошлый раз до написал про шарит поттер
01:56:55
uniq ты надеешься про это делал нашли и
01:56:57
посмотреть вот теперь обладая этими
01:57:01
знаниями ответьте на вопросы почему же я
01:57:03
не написал ни и
01:57:06
вот здесь
01:57:09
начинаются три маленькие настройки а
01:57:11
ведь именно так то есть я просто
01:57:15
использовал максимально подходящий и
01:57:18
эффективный метод для распределения
01:57:20
памяти которые мне здесь нужен мне не
01:57:22
нужна вся эта история динамической
01:57:24
памятью она действительно нужно когда
01:57:26
объекты слишком большие потому что
01:57:28
размер стека фиксирован по умолчанию в
01:57:30
винде стек один мегабайт и он общий для
01:57:33
всех функций то есть для всей вот этой
01:57:34
глубины вложенности у вас только
01:57:36
мегабайт и большие объемы данных то мкс
01:57:38
при для теста нельзя ну а
01:57:43
по производительности мысль потерял
01:57:46
соответственно я бэт уже хотел получить
01:57:49
максимально возможно да и вот здесь эту
01:57:51
производительность бесплатная потому что
01:57:55
понятно почему так в результате давайте
01:57:59
я что сделаю я значит
01:58:03
оставлю вот эти вот значения и в конце
01:58:07
концов уже сложу и так money значит
01:58:10
сумма будет м 1 плюс 2 вот таким вот
01:58:16
образом даже сказал я и сложил так
01:58:20
теперь
01:58:22
давайте выведем результат так давай
01:58:25
сначала на него посмотрим да потом
01:58:26
научимся выводить так ставлю точку
01:58:30
останова вот сюда запускаю свой дебаггер
01:58:41
примерно явно не самый интересный в этот
01:58:43
нормализацию ipad и
01:58:46
почему в сумме посмотрим на даже меньше
01:58:51
вот о чем да мы сейчас исправимся
01:58:55
давайте мы короче сейчас посмотрим без
01:58:57
нормализации да потом тогда посмотрим на
01:58:59
нормализацию и заодно выведем
01:59:01
[музыка]
01:59:04
так все погнали смотреть конструктор мы
01:59:07
это уже умеем делать да поэтому я просто
01:59:10
один раз зайду
01:59:11
таким образом кстати обратите внимание
01:59:14
тоже
01:59:15
по умолчанию у нас находится в памяти
01:59:19
какой-то мусор назначение смысл которых
01:59:21
мы не знаем да и поэтому когда мы
01:59:24
разместили класс атлас мы разместили вот
01:59:27
таким вот образом точнее экземпляра
01:59:28
класса соответственно он отобразился на
01:59:31
кусочек стека в котором находились
01:59:33
какие-то мусорные значения естественно
01:59:36
использовать их нельзя мы поэтому и
01:59:39
пишем конструкторы чтобы их
01:59:40
инициализировать все инициализируем
01:59:42
дублоны санте мы все хорошо
01:59:45
сюда заходить не будем все прекрасно
01:59:48
теперь наша
01:59:51
перегруженная версия оператора плюс
01:59:53
заходим в неё и так что происходит
01:59:57
сначала мы конструируем новый экземпляр
01:59:59
класса мания вот я туда захожу и тут
02:00:02
видно что параметр вот они видны и здесь
02:00:04
d и c да и точно так же они видны вот
02:00:07
здесь b и c так
02:00:10
собственно все подкладывали
02:00:14
сконструировали мы находимся на выходе
02:00:17
из конструктора мании и теперь
02:00:19
проваливаемся в норме так провалились в
02:00:22
норм тоже вот можно посмотреть что
02:00:25
у нас тут происходит вот тут у нас
02:00:28
происходит вот эта штука связанные со
02:00:30
стеком можно кстати не будем и
02:00:34
собственно вот у нас есть дублоны и
02:00:37
сантима да тут нормализация как нам
02:00:39
правильно сказали действительно нет мы
02:00:41
возвращаем ссылку опять же ну самого
02:00:44
себя и эта ссылка
02:00:45
протекает вверх через возвращаемое
02:00:49
значение да
02:00:51
это на самом деле не совсем так ладно
02:00:55
в результате там
02:00:59
происходит
02:01:03
присваивание этого вычисленного значения
02:01:04
в сумму вот оно ну и все стало прекрасно
02:01:10
вывели вот такую штуку так там что-то
02:01:14
про из какой центр я вот тут попытался
02:01:17
оговориться но вовремя спохватился да я
02:01:20
сказал что ссылка в которую вернул норм
02:01:23
протекает через вот этот вот оператор
02:01:26
наверх и давайте сразу этот вопрос
02:01:28
обсудим тут есть подводный к ней связаны
02:01:31
в общем с тем что иногда можно не
02:01:34
правильно встретить объявление
02:01:36
возвращаемых значений вот таким вот
02:01:38
образом и чет мне тут компилятор даже
02:01:44
подсказывает но он подсказывает про
02:01:46
другую проблему
02:01:48
ладно не важно вот именно эта ситуация
02:01:52
вот смотрите здесь я вот такой тип
02:01:54
возвращаемого значения могу сделать
02:01:56
теперь же не подскажет а вот здесь
02:02:00
все перри анализировалась проблему
02:02:03
пропала но тем не менее вот сейчас у
02:02:06
меня будет ошибка кто мне объяснит что
02:02:09
это за ошибкой почему так делать нельзя
02:02:12
почему on our door вылилось в 2 раза
02:02:16
разминаетесь висячая ссылка потому что
02:02:19
стек удалиться или локальные money
02:02:22
удалиться соответственно в нем ссылку на
02:02:24
никуда
02:02:26
эта штука называется как раз висящий
02:02:29
ссылкой dangling reference иногда
02:02:35
ладно так что происходит вот у меня есть
02:02:39
функция main вот у меня есть давайте я
02:02:42
теперь вместо я здесь напишу оператор
02:02:44
плюс
02:02:45
так оператор плюс так что происходит
02:02:50
когда я вот здесь вот здесь это вот
02:02:55
здесь создаю money этот самый money
02:02:59
создается в кадре стека дать вот так вот
02:03:03
он и рисуем
02:03:04
который принадлежит к оператору плюс
02:03:07
далее поскольку
02:03:10
вот этот норм является членом класса и
02:03:15
пока он
02:03:17
выполняется у него там туре свой кадр
02:03:20
стека и все такое но самое главное что
02:03:22
пока он выполняется внутри него есть
02:03:25
корректный указатель завис на указатель
02:03:28
на текущий экземпляр вот этого объекта
02:03:30
для которого это со мной вызывается но
02:03:33
поскольку мы подразумеваем что кто-то
02:03:37
внешней а кто-то внешней это вот эту вот
02:03:40
функция оператор плюс
02:03:43
вызывает функцию норм для корректного
02:03:46
объектом они соответственно у него
02:03:48
ссылка или у него там указатель на вот
02:03:52
этот вот самый экземпляр money в стеке
02:03:54
есть и он валидный и поэтому мы можем
02:03:57
действительно вернуть этот же указатель
02:04:00
и он все еще продолжит оставаться
02:04:02
корректным потому что мы его явно нигде
02:04:05
не поменяли с другой стороны так это
02:04:08
понятно рассуждение
02:04:11
то есть мы вызываем функцию норм для
02:04:14
экземпляра как на которые существуют
02:04:16
корректный указатели он размещен в
02:04:18
какой-то области памяти в нашем случае
02:04:20
встречи и поскольку мы можем вернуть
02:04:23
указатель на самого себя
02:04:25
да то есть потому что этот указатель
02:04:28
валидный в момент вызова до вызова ну и
02:04:31
соответственно после вызова мы также
02:04:33
считаем что он все еще корректный все
02:04:35
происходит хорошо все происходит в
02:04:37
рамках одного кадра с т.к. для одной
02:04:39
функции нашем случае оператор плюс
02:04:41
никаких проблем нет а что происходит вот
02:04:44
здесь после того как мы вызываем норм
02:04:47
соответственно мы
02:04:49
возвращаем вот этот самый адрес дали вот
02:04:53
эту самую ссылку которая находится на
02:04:55
стыке другой вызываемой функции
02:04:58
во внешнюю вызывающую функцию
02:05:01
по-английски это называется
02:05:05
koller function но колеров напишу а вот
02:05:10
эта штука по-английски называется колье
02:05:12
function то есть вызываемая функция так
02:05:15
и что происходит мы возвращаем
02:05:17
собственную ссылку на кусочек стыка
02:05:21
функции которая была вызвана но
02:05:26
после того как вызов закончится то есть
02:05:29
вот три черных закончиться вот этот кадр
02:05:32
стека будет уничтожен и вернут
02:05:35
операционной системе соответственно это
02:05:37
чуть-чуть не так но мы будем думать что
02:05:40
это так соответственно что происходит
02:05:43
что
02:05:45
больше использовать вот эту ссылку
02:05:48
использовать вот этот адрес и объект уже
02:05:50
нельзя потому что этот объект или память
02:05:53
в котором этот объект лежал было
02:05:55
уничтожено собственно это проблема
02:05:57
висящий ссылки потому что ссылка есть
02:05:59
объект уже нет и это access violation
02:06:02
который мы с вами тоже видели в прошлый
02:06:04
раз да там только там я и вызвал
02:06:06
освобождение области памяти явно при
02:06:09
помощи делита а здесь освобождение
02:06:11
памяти произошло неявное это сделала
02:06:13
система в момент когда вызов функций был
02:06:17
полностью завершена поэтому чтобы вот
02:06:19
такого безобразия не было мы не имеем
02:06:22
право возвращать ссылки на локальные
02:06:24
переменные вот этот ключевое правила
02:06:26
которые надо никогда нельзя возвращать
02:06:28
ссылки указатели на локальной переменной
02:06:30
потому что они будут удалены это
02:06:34
абсолютно не так все плюс 0 в сишарпе и
02:06:37
way over там все выделяется в хиппи и
02:06:39
вот из hipath то что вы выделили вы
02:06:43
возвращать можете соответственно все
02:06:45
плюс плюс выделении данных happy
02:06:47
производится явно тоже при помощи new и
02:06:50
если вы что-то выделили при помощи new
02:06:52
вы возвращать ссылку и указателем там не
02:06:55
ссылками на указатель вы можете но на
02:06:57
локальные данные никогда запомнили эту
02:07:00
историю поэтому мы делаем вот так вот
02:07:03
что происходит при этом при этом
02:07:06
происходит копирование то есть вот это
02:07:09
локальная переменная мании вот это вот
02:07:14
которая лежит вот здесь еще зеленому
02:07:17
виду чтобы уж совсем каша была да вот
02:07:20
здесь все все те данные которые в ней
02:07:23
есть будут по завершению вызова
02:07:27
скопированы это компилятор делает
02:07:29
автоматически вот сюда в ту область
02:07:32
памяти которая
02:07:33
отведена под переменную сумму на самом
02:07:37
деле компиляторы современные умеют
02:07:39
делать риттер well optimized то есть
02:07:44
оптимизацию возвращаемого значения и
02:07:46
избежать лишних копирований но на
02:07:50
базовом так общее
02:07:59
так вот и
02:08:01
избежать вот этого копирование еще раз
02:08:04
но на базовом уровне
02:08:05
когда все оптимизации отключены например
02:08:08
или когда там еще что то происходит в
02:08:11
ментальная нашу модель да то есть удобно
02:08:13
представлять именно так что происходит
02:08:15
прямая копирование значение ссылка при
02:08:18
этом у локальных данных своя у данных
02:08:22
функции
02:08:23
вызывающий caller до своя все это была
02:08:29
такая проблема на которую всегда надо
02:08:32
обращать внимание иначе будет не очень
02:08:35
хорошо так кроме того что то стоило
02:08:37
пообсуждать вот этот вот момент да как
02:08:40
нам правильно подсказали что я тут делаю
02:08:42
сейчас казалось бы неэффективную вещь
02:08:45
почему потому что я передаю money по
02:08:47
значению при этом происходит копирование
02:08:50
только теперь уже параметров функции то
02:08:52
помните как мы говорили что ну не хорошо
02:08:54
копировать параметры функции поэтому мы
02:08:56
передавали их через констант ную ссылку
02:08:59
то есть правильные бы казалось сделать
02:09:02
вот так
02:09:05
так cans
02:09:08
money
02:09:10
lhs ну и так далее то же самое для
02:09:12
второго параметра тем не менее это не
02:09:14
совсем так почему потому что
02:09:17
значение которые маленькие по размеру
02:09:22
а тип money он маленький по размеру и
02:09:25
вообще всю типа они в большинстве своем
02:09:27
маленькие по размеру
02:09:30
можно передавать через копирование это
02:09:34
связанно с тем как данные лежат в кашах
02:09:36
как они действительно там копируются из
02:09:40
одной линии каша в другую линию каша и
02:09:44
как обрабатываются ссылке а ссылки
02:09:47
обрабатываются через там снятие косвенно
02:09:49
sti и дополнительного запроса к памяти
02:09:51
соответственно для больших объемов
02:09:54
данных эту оптимизацию надо делать
02:09:56
обязательно то есть мы никогда не
02:09:57
передаем стринги по значению всегда
02:10:00
стринги передаем посылки но вот такие
02:10:02
маленькие данные которые
02:10:04
могут быть тривиально скопированы да вот
02:10:07
такие как 2 in the вполне можно
02:10:09
передавать по это будет даже эффективнее
02:10:12
за счет именно аппаратных особенностей
02:10:14
работы современных процессоров чем
02:10:17
передача по ссылке это возвращаясь к
02:10:20
вопросу про инжиниринг и понимания до
02:10:23
аппаратной платформы так теперь давайте
02:10:26
научимся выводить эту штуку сравнивать и
02:10:29
выводить напишем один оператор сравнения
02:10:31
все остальные операторы писать не буду
02:10:33
там уже по документации посмотрите они
02:10:35
пишутся абсолютно также так давайте
02:10:38
посмотрим на оператор сравнения
02:10:42
bull оператор равно соответственно
02:10:48
money
02:10:50
lhs ii
02:10:52
money
02:10:54
р.с. так как будем сравнивать и тёрн и
02:11:00
ваши с
02:11:08
может сначала но им вызвать потому что
02:11:11
даже будут все равно эквивалентные
02:11:13
значение даже если во второй лиге
02:11:15
нормализованным передадим это на самом
02:11:18
деле история хорошая дам сейчас мы ты
02:11:20
сделаем
02:11:26
rhs сентимо равно
02:11:35
теперь сразу такой вопрос
02:11:38
не будет ли это каким-то образом влиять
02:11:41
на те данные которые в этот оператор
02:11:43
передаются
02:11:46
можно тут спросить случаем опять не
02:11:49
забыли что нас аллах из rhs сантимов
02:11:55
еще раз вот где re-therm и раз . рецепт
02:11:59
на и 2 .
02:12:02
нас дублоны получается левая правая туда
02:12:06
спасибо я тут печатаю со страшной силой
02:12:09
и
02:12:10
как говорил наш сектор по математике
02:12:13
когда я пишу у меня мозг отдыхает вот
02:12:15
примерно из этой же оперы
02:12:18
скопировали ничего не
02:12:20
датой здесь эти нормы действительно
02:12:23
можно вполне вызывать никаких проблем
02:12:26
нет потому что мы действительно
02:12:29
вызвали операцию копирования до передали
02:12:33
по значению поэтому их можно прекрасно
02:12:35
менять и никаких проблем с тем что
02:12:37
изменятся внешние данные у нас не будет
02:12:39
так сравнили отлично сейчас мы пишем ну
02:12:43
и последний момент а как мы будем
02:12:45
выводить
02:12:46
значение
02:12:49
дублонов и сантимов
02:12:52
разве операторы присваивания не в паре
02:12:54
перегружается с этим с отрицанием но
02:12:58
сравнение они присваивания да
02:12:59
действительно имеет смысл ну как бы
02:13:01
требование нет но и всегда естественно
02:13:04
перегружают в паре потому что многие
02:13:06
контейнеры и все чем потом будет отвалы
02:13:08
принимать они действительно
02:13:10
полагаются что надо это делать
02:13:15
мне кажется нет еще раньше не выдавал
02:13:18
может современные компиляторы давайте
02:13:21
кстати а пока не буду его писать заодно
02:13:23
и проверим эту гипотезу
02:13:26
определить оператора две стрелочки чтобы
02:13:30
выводить
02:13:33
на коне наконец-то у нас я помню
02:13:36
были
02:13:38
предложения ты сделать уже пару занятий
02:13:40
как да и наконец то мы это сделаем так
02:13:44
острым
02:13:45
нам надо перегрузить оператор вы дав
02:13:48
поток
02:13:50
который записывается как оператор две
02:13:54
стрелочки на самом деле это оператор
02:13:55
побитого сдвига влево до ну вот все + +
02:13:59
это тоже такая его особенность оператора
02:14:02
можно перегружать нарушая их семантику
02:14:05
соответственно исходная семантика
02:14:07
оператора вот это в это семантика с h l
02:14:12
shift лифт или побитого сдвинут значение
02:14:15
влево но для потоков ввода-вывода
02:14:18
назад этот оператор побитого сдвига
02:14:21
влево был перегружен с изменением
02:14:23
семантики и его в этом случае наделили
02:14:26
новой семантикой поместить в поток в
02:14:29
целом но это произошло очень давно никто
02:14:33
не помнит почему но в целом это очень
02:14:35
плохая практика когда вы при перегрузке
02:14:38
оператора меняете его семантику и есть
02:14:41
типа новое негласное правило что
02:14:44
перегруженный оператора дьявол должен
02:14:46
делать ровно то что делает этот оператор
02:14:50
по семантике для типа int
02:14:54
сейчас я допишу и еще раз к этому
02:14:56
вернусь так че мы тут делаем тут мы вас
02:15:01
помещаем сначала
02:15:02
дублоны и кстати тоже наверное было бы
02:15:06
неплохо знать и при этом
02:15:10
нормировать да давайте увидим
02:15:13
какой-нибудь красивый значок вот такой
02:15:15
вот это будет наш знак дублонов так
02:15:18
дублоны и собственно сентимо
02:15:24
все на этом мы заканчиваем
02:15:27
и фритюр нос поскольку оператор по 5
02:15:32
сдвига обладает вот таким
02:15:38
синтаксисом он должен возвращать
02:15:40
какое-то значение мы возвращаем значение
02:15:42
вот такой и тут обратите внимание все
02:15:45
что я тут сейчас долго и упорно
02:15:47
рассказывал про вот это вот оператора
02:15:49
мании которые складывать оператор плюс
02:15:51
для мане относительно возвращаемого
02:15:53
значит значению тут тоже немножечко все
02:15:55
нарушена а мы на самом деле возвращаем
02:15:58
ссылку на поток они сам поток но здесь
02:16:01
это безопасно потому что
02:16:05
мы этот поток передаем в качестве
02:16:07
аргумента да то есть на самом деле это
02:16:10
требование что мы не возвращаем ссылок
02:16:12
на локальные данные она здесь не
02:16:15
нарушена но тем ни менее
02:16:18
прекрасный язык си плюс плюс который
02:16:20
позволяет стрелять себя в обе ноги здесь
02:16:24
его эта особенность прекрасно
02:16:25
проявляется так обычно пишут вот так
02:16:28
можно писать и вот так ничего как бы вам
02:16:31
не запрещает это делать но я вот так
02:16:33
писать не люблю потому что вообще
02:16:35
непонятно что начинает при этом
02:16:37
происходить поэтому мы напишем попроще
02:16:43
так
02:16:45
на самом деле можно перегрузить и
02:16:48
оператор ввода или оператор чтения это
02:16:52
будет оператора
02:16:57
[музыка]
02:17:00
извлечь из потока это
02:17:03
вот я отключал отключался эти
02:17:05
уведомления все равно их никак не
02:17:08
изведешь короче так
02:17:11
оператор извлечь из потока он имеет вот
02:17:16
такое вот такой вот сигнатуру ли такой
02:17:20
прототип
02:17:26
std и стрим
02:17:29
оператор вот такой здесь тоже семантика
02:17:32
оператор этот оператор из hr или побегав
02:17:34
по битового сдвига вправо но опять же
02:17:37
для потоков о до вывода это было
02:17:40
изменено и тут на дома не передавать уже
02:17:45
по
02:17:46
ссылке потому что мы будем ее
02:17:48
модифицировать и
02:17:51
выглядеть он может например вот так вот
02:17:54
из читали дублоны и
02:17:58
считали так никаких символов
02:18:01
форматирования мы тут уже не будем так
02:18:04
стоп вот так вот сенти мы собственно
02:18:06
всего ричард из но это парный оператор
02:18:09
оператору поместить в поток операторы
02:18:11
извлечь из потока до которой собственно
02:18:14
из сена например может нам прочитать
02:18:16
значению дублонов и сантимов так как он
02:18:19
в этом случае будет извините если мы
02:18:22
введём до плоды нажмём enter он считает
02:18:24
это или он считает то чтобы после entire
02:18:26
video но он считает ну в смысле он enter
02:18:29
считает но считает и следующее число то
02:18:31
есть он придут прочитает из потока два
02:18:34
целых числа разделенных любыми
02:18:36
разделителями для него там enter и и
02:18:38
пробелы разделить ну сейчас попробуем
02:18:41
короче янтарь и пробелы будут
02:18:43
разделителями так давайте попробуем
02:18:45
тогда вот как сделать это я сотру у меня
02:18:48
будет фиксированная сумма 125 и
02:18:52
какую-нибудь сумму я веду да
02:18:55
так money м2 и
02:18:58
тут случился провал потому что вот так я
02:19:02
сделать не могу а так я сделать не могу
02:19:04
потому что меня отсутствует конструктор
02:19:07
по умолчанию у меня есть только
02:19:08
конструктор с параметрами давайте
02:19:10
сделаем конструктор по умолчанию
02:19:14
он может нам понадобится как раз для
02:19:17
того чтобы инициализировать пустые
02:19:20
значения да или значение с пустыми этими
02:19:24
так что я тут могу сделать я могу
02:19:26
оставить значение дублоны из интим и
02:19:30
дней инициализирован ими то есть у меня
02:19:32
будет какой-то мусор и может быть в этом
02:19:34
есть смысл кстати в этом случае
02:19:37
считается что поля будут инициализирован
02:19:40
и по умолчанию по-английски это
02:19:42
называется дефолт и не she lays то есть
02:19:44
теми значением которые были в памяти это
02:19:47
оправданно с точки зрения
02:19:49
производительности но может быть не
02:19:50
оправдан с точки зрения безопасности да
02:19:53
если я там что ты сделал либо так вот
02:19:56
control z нажму я могу собственно явно
02:19:59
эти значения инициализировать нулями вот
02:20:02
таким вот образом и тогда у меня будет
02:20:03
класс созданный конструктором по
02:20:05
умолчанию но соответственно с
02:20:07
крайним про не целевыми значениями но
02:20:11
его тут как раз вот эта история до что
02:20:13
при помощи универсального инициализатор
02:20:15
а можно вот явно это значение установить
02:20:18
вызвав конструктор по умолчанию вот
02:20:21
таким вот образом да через универсальный
02:20:23
инициализатор вот эти скобки если
02:20:26
раскопки поставим то-то мне нравится
02:20:28
конструктор господа вызовется да вот так
02:20:30
вот тоже можно делать и
02:20:32
или не можно
02:20:35
как-то нам объяснит что произошло
02:20:46
короче я поставлю тут два знака
02:20:52
таким вот так вот ?
02:20:54
и напишу вот такую вот штуку как мост
02:20:58
vixen парсинг
02:21:01
синтаксический анализатор эту строку
02:21:03
воспринимает как объявление функции
02:21:05
добра вложенный функция нельзя здесь
02:21:07
объявляется но зачем-то это фича
02:21:09
воспринимает сильно так но это на самом
02:21:12
деле не объявление вложены функции это
02:21:16
объявление функции которые возвращают
02:21:19
мане и ним не принимает никаких
02:21:21
параметров с именем м2 если вам где-то
02:21:24
такая функция то есть это ее прототип и
02:21:26
если бы у вас где-то такая функция была
02:21:28
с таким прототипом вы бы могли ее
02:21:30
как-нибудь были здесь по использовать
02:21:32
короче гуглить вот по этим словам мост
02:21:35
vixen парсинг и одна из причин по
02:21:39
которой все плюс плюс ввели
02:21:41
универсальный инициализатор вот этот вот
02:21:44
самый да это как раз решение проблемы
02:21:46
мост fixing парсинга и
02:21:48
объявление
02:21:50
переменных при помощи вот такого
02:21:52
синтаксис это важно было для шаблонов
02:21:57
так оставлю короче это сотрудник
02:22:01
так чем мы хотим сделать мы хотим
02:22:04
чего-нибудь ввести давайте введём так
02:22:07
kontrol ц control в
02:22:10
ситаут
02:22:14
интер
02:22:17
интер
02:22:18
таким вот образом
02:22:21
можно сразу сбросить поток с т д н д л
02:22:29
далее мы используем оператор наш
02:22:32
перегруженный
02:22:34
так для мане для того чтобы ввести
02:22:37
значение м 2 вот таким вот образом
02:22:40
теперь мы складываем 1 плюс м2 все у нас
02:22:44
хорошо и выводим результат итак резалт
02:22:51
резалт вот таким вот образом
02:22:55
так
02:22:57
написал одну подумал про другое так
02:22:59
сумки ну давайте смотреть
02:23:06
так наверное поставлю сразу без точек
02:23:09
останова все посмотрим что у нас
02:23:11
получится
02:23:25
так я кстати после интера intel написал
02:23:28
немножечко заряда как раз за счет того
02:23:30
что они солдаты кэмбелл у меня
02:23:32
перешел курсор на следующую строку не
02:23:35
чувствуешь ну так как я могу вводить
02:23:37
значения вот я на же написал 12 нажал
02:23:39
enter написал 23 нажал enter то есть два
02:23:44
числа разделенные любым разделителем
02:23:47
интер это разделитель да ну поэтому
02:23:49
пожалуйста вот пока либо я бы мог
02:23:52
сделать вот так вот кстати опять за 20
02:23:54
речь эту штуку ладно
02:23:58
12-21 12-13 разделенные пробелом
02:24:02
соответственно разделитель данном случае
02:24:04
будет пробел нажал enter но та же самый
02:24:06
результат у нас получился 1338 ну на
02:24:09
первый взгляд
02:24:11
работает так давайте теперь а
02:24:16
если вводить например
02:24:19
12 и один он будет выводить как 12.1
02:24:25
вкладывать как 1201
02:24:36
я понял наверное что вы говорите вот
02:24:39
таким вот образом но
02:24:42
так
02:24:46
мы про это или нет но дано при просто
02:24:50
здесь это не так видно если вы вывод
02:24:54
сделаете м2 просто то вы увидите что
02:24:57
выводится 12 1 и он будет выводить 12 ,
02:25:01
1 а когда сложите получится я понял
02:25:04
будто он складывал но так как эту
02:25:07
проблему решить
02:25:09
король добавлять до фишка в том что мы
02:25:13
не форматируем вот это значение
02:25:15
правильно потому что надо сантима
02:25:17
форматировать таким образом чтобы
02:25:22
показать что
02:25:24
если мы вели значение меньше десяти надо
02:25:27
собственно печатать 0 как это сделать
02:25:31
тут надо вздохнуть и вспомнить про его
02:25:34
манипуляторы про которые конечно никто
02:25:36
никогда не помнят короче значение в
02:25:39
потоке а можно выводить при помощи
02:25:42
различных fuck нету даже подсказка есть
02:25:45
форматировать при помощи различных
02:25:47
манипуляторов например вот есть такой
02:25:49
манипулятор st
02:25:54
объявленный в стандартном федоре и
02:25:56
аммонит который позволяет задать ширину
02:25:59
выводим его поля а кроме того есть
02:26:02
modifica манипуляторы типа сад фил
02:26:06
которые позволяют задать например это
02:26:08
поле ну заполнитель какой-то для этого
02:26:11
поля и мы можем попробовать сделать
02:26:14
что-то типа
02:26:18
вот такой вот штуки
02:26:21
cd2
02:26:24
сэм фелл 0
02:26:29
фокус может не удастся поскольку я этого
02:26:33
миллиард лет не делал на самом деле
02:26:35
сразу тут надо
02:26:37
стену плача что вот вывод все плюс плюс
02:26:41
абсолютно ужасен то есть вот вся эта
02:26:43
история с
02:26:45
потоками я кстати уже когда мы игру
02:26:48
писали дайте кто учат наших посиделках я
02:26:51
немножечко про это и
02:26:54
он манит немножко про это говорил что на
02:26:59
самом деле вот этот механизм
02:27:03
поток вывода он с одной стороны хорош
02:27:06
потому что он типа безопасный да и он
02:27:11
позволяет нам
02:27:13
использовать перегрузку операторов для
02:27:15
того чтобы ну как естественно выглядели
02:27:18
новые типы но с другой стороны по
02:27:19
синтаксису и вот потому что происходит
02:27:21
он абсолютно ужасен да есть в
02:27:24
другие функции ввода вывода вот например
02:27:26
в библиотеке си который конечно
02:27:28
sepultura поддерживается есть всякие
02:27:30
принтеры и форматные стройки и вот она
02:27:33
моя любимая короче то есть то же самое
02:27:36
там выглядела в три раза проще и еще бы
02:27:39
работала быстрее ну ладно будем пытаться
02:27:42
сделать правильно посмотрим что у нас из
02:27:44
этого получится а когда оно закончится
02:27:47
вот это вот
02:27:49
форматирования уже при выходе из метро
02:27:52
там на самом деле его бы еще и надо
02:27:54
назад поставить потому что он его
02:27:56
сохранит то есть фактически вот эти
02:27:58
манипуляторы вызывают функции воз
02:28:01
которые изменяют состояние потока и все
02:28:04
остальное форматирование будет проходить
02:28:06
при этом формат сейчас мы кстати
02:28:08
попробуем посмотреть вот таким вот
02:28:11
образом я это сделаю
02:28:13
только надо два раза попробовать вывести
02:28:16
это значение
02:28:17
так давайте во-первых я вот это вот н.д.
02:28:22
сюда перенесу
02:28:25
так а во-вторых я вот эту строчку
02:28:28
скопирую и посмотрим как у нас
02:28:30
модифицирована состояние потока
02:28:35
вы каким-то образом
02:28:43
так наконец-то можно ввести значение 11
02:28:48
так
02:28:50
ничего и не увидел короче так давайте мы
02:28:53
выведем
02:28:56
так вот так вот м один черт мне кажется
02:29:02
что у меня там вообще не чувствует
02:29:03
ничего не заработала так плюс
02:29:07
разберемся
02:29:11
m2m один плюс м 2 вот так вот
02:29:16
равняется
02:29:18
сумме все
02:29:20
мои слова разом тогда можно в общем то
02:29:23
истерить
02:29:25
теперь это всё копирую
02:29:32
смотрим
02:29:44
так я ввожу значение 11
02:29:47
вот что у меня получается
02:29:50
ну то есть получается правильно но я вас
02:29:53
похоже обманута надо посмотреть все таки
02:29:55
чего документации пишут она получается
02:29:58
что она меняет только на следующий вывод
02:30:00
да
02:30:02
так
02:30:16
ну спасибо так
02:30:31
короче нам чудо на первый взгляд ничего
02:30:33
не пишут ладно вопрос требует
02:30:35
дополнительного изучения но судя по
02:30:38
результату действительно это работает
02:30:40
только на следующий вывод
02:30:42
как то вот так вот
02:30:44
фух страшная штука
02:30:49
кстати по поводу равенство да я все-таки
02:30:52
хотел этот оператор по использовать
02:30:54
что-то никак не по использовал давайте
02:30:56
мы тоже это попробуем быстро сделать
02:30:59
времена стремительно уходит
02:31:04
там если добавить еще раз в конце вывод
02:31:07
то он действительно сбросятся на стройке
02:31:09
вот эти вы видят ним вместо 022 так это
02:31:12
куда добавить и
02:31:15
вот там где мы
02:31:17
выразили оператор вывода
02:31:21
я имею до чтобы проэкспериментировать
02:31:24
вот здесь просто сентимо второй раз если
02:31:26
вывести то можно увидеть что
02:31:28
вот эти настройки считался твой работают
02:31:31
только для первого вывода отлично
02:31:34
сносило
02:31:35
будем знать
02:31:40
tags
02:31:42
что мы делаем мы выводим
02:31:49
равенство вот он все
02:31:52
вспомнил что показывал так делаем значит
02:31:56
ciao ciao уделаем чего им 1 равно им 2
02:32:01
просто напишу ок так вот
02:32:05
м 1 1 2 3 м2 и
02:32:08
студентов
02:32:19
частном похоже скажу что все очень плохо
02:32:24
кто к нам расскажет в чем тут проблема о
02:32:27
более дает определение вывода
02:32:31
я бы посомневался
02:32:37
нужно скобки заключить потому что это
02:32:40
понятно
02:32:42
в чем проблема
02:32:45
панели пытается бить в из них сделать
02:32:47
для булево значение что за такое тут
02:32:50
надо короче очень внимательно посмотреть
02:32:54
на приоритет вот этих вот операторов да
02:32:56
и судя потому что происходит и под
02:32:58
поэтому на коду ошибки он говорит что
02:33:02
бинарный оператор
02:33:04
вот такой то есть ну давайте назовем
02:33:07
правильный сошел нет оператора который
02:33:09
бы принимал
02:33:11
левосторонняя пират операнды типом они
02:33:14
вот этот вот ну а соответственно там
02:33:16
будет правда про про правосторонний он
02:33:19
ничего не написал о правосторонний это
02:33:21
вот этот манипулятор с т д н д л то есть
02:33:24
получается что поскольку приоритет вот
02:33:26
этих операций разный он пытается
02:33:29
вычислить не вот то что я хочу вот это
02:33:31
вот где так сделал не вот это вот
02:33:37
вот так вот а он пытается это вычислить
02:33:41
вот таким вот образом то есть он
02:33:43
пытается
02:33:44
сдвинуть
02:33:46
м2 с манипулятором н д л а ему это не
02:33:50
удается он ругается вот таким вот
02:33:53
безобразием
02:33:55
теперь я думаю все
02:33:58
ощутили за прелесть там почему 1 как там
02:34:01
говорит что мы не используем перегрузку
02:34:03
операторов и правильно собственно делаем
02:34:05
так давайте посмотрим что там у нас с
02:34:13
этим значением так у нас в результате а
02:34:16
сравним м 172 до поэтому давайте сразу
02:34:18
виду 125 но собственно вот 125 плюс 125
02:34:24
равно 253 к одину таким вот образом а
02:34:28
если я веду значение которой нет у меня
02:34:31
будет у нее ведь это сделаем 2 и 3 будет
02:34:36
ноль все на исследовались последний
02:34:40
момент как раз связано с вашим
02:34:41
замечанием по поводу
02:34:43
перегрузки операторы не равно но вот как
02:34:46
видите их можно перегружать отдельно да
02:34:47
но большинство всяких алгоритмов всего
02:34:51
что есть стандартной библиотеки она
02:34:52
требует естественно перегрузки парой
02:34:55
потому что ну как бы логично да и очень
02:34:58
часто делают перегрузку одного оператора
02:35:00
через перегрузку другого оператора
02:35:04
поскольку мне второй раз все вот эту
02:35:06
историю писать не хочется я могу просто
02:35:08
написать вот так вот так не оператор
02:35:12
равно соответственно л.с. ,
02:35:16
rhs вот таким вот образом ну и все
02:35:19
теперь когда я буду вызывать оператор не
02:35:22
равно соответственно меня будет
02:35:23
вызываться оператор равно аналогичным
02:35:26
образом на самом деле перегружаются все
02:35:28
остальные операторы там достаточно
02:35:29
перегрузить только оператор меньше а все
02:35:32
остальные операторы перегружаются через
02:35:34
набор
02:35:36
точнее надо перегружать оператор равно и
02:35:39
оператор меньше а все остальные
02:35:41
операторы перегружаются через эти два до
02:35:44
соответственно оператор больше
02:35:46
перегружаются через оператор отрицание
02:35:49
меньше и отрицание равно ну и так далее
02:35:52
там сами советы распишите
02:35:55
все фух вроде бы свернутой пуме
02:35:58
разобрались
02:36:00
страной даже здесь не писать не писать
02:36:04
ключевое слово пера автор
02:36:06
типа не равно v или терне но не и в
02:36:11
скобочках lhs равно равно хорошо так
02:36:13
можно да да да да то есть вы можете
02:36:16
естественно написать вот это вот
02:36:22
вот это это абсолютно та же самое да
02:36:25
видите нам подсвечивают но просто чтобы
02:36:29
в более явном виде написать вызов
02:36:32
оператора до его можно вызвать как
02:36:34
обычную функцию собственно да это то что
02:36:35
я показал а
02:36:41
вот по поводу вот этих вот у воды от
02:36:44
выводов
02:36:46
лучше погуглить best practice и по
02:36:49
поводу того как мы
02:36:50
hangin on 3d контента или
02:36:55
что именно в контурного конец года и
02:36:59
отмена вода там есть у
02:37:04
короче лучше погубишь называется кароч у
02:37:06
потока есть состояние и перегружены
02:37:08
оператор отрицания да вы можете всегда
02:37:11
там посмотреть состояние потока и над и
02:37:15
использовать например оператор отрицание
02:37:17
для того чтобы определить был из чата на
02:37:19
значение или нет она устанавливается
02:37:21
после того как закончится операция
02:37:23
ввода-вывода
02:37:25
ног в чем для linux это разве не
02:37:28
сигналами делается
02:37:30
ну в смысле сигналами
02:37:34
она по моему kontrol ц control data
02:37:37
разные сигнал один из них сектор 2 не
02:37:40
помню что и не там просто это мне
02:37:44
кажется немножко разные вещи потому что
02:37:46
тут имеется в виду что в потоке могут
02:37:49
находиться символы конца файла например
02:37:51
да то есть если вы через платок
02:37:52
считываете что-то из файла
02:37:54
соответственно вам надо определить
02:37:55
состояние окончания потока да это как
02:37:58
раз делается когда считывается
02:37:59
соответствующий символ в потоке там
02:38:02
символы of например и уаз
02:38:04
устанавливается в состоянии опытом можно
02:38:07
проверить если
02:38:08
там у из и есть вот эта штука я в
02:38:12
которой называть да то есть вы можете
02:38:14
проверить что был достигнут окончании
02:38:16
ввода как раз вот оси г это штуки
02:38:20
которые обрабатываются уже процессом
02:38:22
непосредственно в консольном
02:38:38
вот но просто по поводу вот такого
02:38:41
использовать но вообще по поводу
02:38:42
использования потоков тут все по разному
02:38:46
то есть на сколько я знаю большинство
02:38:48
людей потоки все-таки ввода-вывода не
02:38:50
используют у всех там свои какие-то
02:38:52
абстракции поверх файлов и
02:38:54
ну как бы все пользуются своими об
02:38:56
саксами по верхами мы будем пользоваться
02:38:59
потоками ввода-вывода вот по
02:39:02
воскресеньям ну потому что это самый
02:39:03
простой способ
02:39:06
но не сознание самый красивый ну как то
02:39:09
вот так вот a
02:39:13
spaceship оператор мы не рассматриваем
02:39:16
но тут как раз кривой кампер который да
02:39:19
нет мы его не рассматриваем но его можно
02:39:24
посмотреть вот здесь
02:39:29
так вот так вот я его покажу да можно
02:39:33
посмотреть на то как он реализуется и
02:39:35
там фишка в том что вы возвращаете ну
02:39:40
собственно одно вот из таких значений да
02:39:42
там разные типы орды ринга еще
02:39:45
существует тоже про них можно почитать в
02:39:48
вы здесь ну и смысл такой что вы
02:39:50
возвращает вы перегружаете один вот этот
02:39:53
оператор
02:39:54
летающая тарелка да и
02:39:57
все остальные все остальные операторы
02:40:00
компилятор может из него вывести сам
02:40:03
собственно вот но тут ничего сверх
02:40:06
естественного нет то есть вот такой вот
02:40:08
пожалуйста пример а
02:40:12
тернарный оператор важно
02:40:14
тернарный оператор нет там есть
02:40:18
операторы которые не перегружаются это
02:40:20
как раз тернарный оператор оператор ,
02:40:23
по-моему все остальные предметы
02:40:29
ну да да да я как раз говорю есть список
02:40:31
операторов которые не перегружаются это
02:40:33
тернарный оператор , и по-моему .
02:40:37
все остальные то есть стрелки
02:40:40
разыменовывает
02:40:42
да люцида все бинарные унарные

Описание:

Лекция 2021.10.09

Готовим варианты загрузки

popular icon
Популярные
hd icon
HD видео
audio icon
Только звук
total icon
Все форматы
* — Если видео проигрывается в новой вкладке, перейдите в неё, а затем кликните по видео правой кнопкой мыши и выберите пункт "Сохранить видео как..."
** — Ссылка предназначенная для онлайн воспроизведения в специализированных плеерах

Вопросы о скачивании видео

mobile menu iconКак можно скачать видео "А'21-4. Value Types"?mobile menu icon

  • Сайт http://unidownloader.com/ — лучший способ скачать видео или отдельно аудиодорожку, если хочется обойтись без установки программ и расширений. Расширение UDL Helper — удобная кнопка, которая органично встраивается на сайты YouTube, Instagram и OK.ru для быстрого скачивания контента.

  • Программа UDL Client (для Windows) — самое мощное решение, поддерживающее более 900 сайтов, социальных сетей и видеохостингов, а также любое качество видео, которое доступно в источнике.

  • UDL Lite — представляет собой удобный доступ к сайту с мобильного устройства. С его помощью вы можете легко скачивать видео прямо на смартфон.

mobile menu iconКакой формат видео "А'21-4. Value Types" выбрать?mobile menu icon

  • Наилучшее качество имеют форматы FullHD (1080p), 2K (1440p), 4K (2160p) и 8K (4320p). Чем больше разрешение вашего экрана, тем выше должно быть качество видео. Однако следует учесть и другие факторы: скорость скачивания, количество свободного места, а также производительность устройства при воспроизведении.

mobile menu iconПочему компьютер зависает при загрузке видео "А'21-4. Value Types"?mobile menu icon

  • Полностью зависать браузер/компьютер не должен! Если это произошло, просьба сообщить об этом, указав ссылку на видео. Иногда видео нельзя скачать напрямую в подходящем формате, поэтому мы добавили возможность конвертации файла в нужный формат. В отдельных случаях этот процесс может активно использовать ресурсы компьютера.

mobile menu iconКак скачать видео "А'21-4. Value Types" на телефон?mobile menu icon

  • Вы можете скачать видео на свой смартфон с помощью сайта или pwa-приложения UDL Lite. Также есть возможность отправить ссылку на скачивание через QR-код с помощью расширения UDL Helper.

mobile menu iconКак скачать аудиодорожку (музыку) в MP3 "А'21-4. Value Types"?mobile menu icon

  • Самый удобный способ — воспользоваться программой UDL Client, которая поддерживает конвертацию видео в формат MP3. В некоторых случаях MP3 можно скачать и через расширение UDL Helper.

mobile menu iconКак сохранить кадр из видео "А'21-4. Value Types"?mobile menu icon

  • Эта функция доступна в расширении UDL Helper. Убедитесь, что в настройках отмечен пункт «Отображать кнопку сохранения скриншота из видео». В правом нижнем углу плеера левее иконки «Настройки» должна появиться иконка камеры, по нажатию на которую текущий кадр из видео будет сохранён на ваш компьютер в формате JPEG.

mobile menu iconСколько это всё стоит?mobile menu icon

  • Нисколько. Наши сервисы абсолютно бесплатны для всех пользователей. Здесь нет PRO подписок, нет ограничений на количество или максимальную длину скачиваемого видео.