Фигурная инициализация в С++ | Углубленное программирование на C++: (По книге Скотта Мейерса) #6
ฝัง
- เผยแพร่เมื่อ 9 ก.พ. 2025
- Больше видео: sponsr.ru/pole...
В этом видео мы детально рассмотрим главу 3.1 книги Скотта Мейерса "Effective Modern C++", которая называется "Различие между { } и () при создании объектов". Мы разберем что такое унифицированная (или же фигурная) инициализация, где она может использоваться и какие подводные камни содержит
Такой канал по плюсам - это то, чего не хватало этому миру
Ага, а то у Константина Владимирова, слишком сложные нюансы для профи, а у других азы. Середина.
С++ прекрасно решает проблемы, которые сам же и создаёт :D
Хороший язык. Люблю инструменты, в которые можно закопаться, когда нефиг ими делать.
все по книжке) идеально для закрепления
спасибо!!
Спасибо, Дмитрий, только с вашими роликами разобрался с умными указателями. Вы очень хорошо объясняете.
Ты крут, чел! И с фоном и с микрофоном наладил прям контент. Микрофон реально решает, слушать тебя приятно! И тематика не банальная! Сам осваиваю C++, вот твои все видосы посмотрю. Это первый. Респект.
Так вообще по Константину Владимирову учусь, но у тебя, судя по заголовкам видосов, можно подсмотреть отдельные детали под микроскопом!
Владимир Константинов не учит, а флексит на лекциях. Понимают его 1-2 подсоса на первых партах, к которым он то и дело по ходу лекции обращается. И то потому что они явно не рядовые студенты, а аспиранты какие-то, которые ту или иную тему уже знают.
Короче, вижу фигурные скобки -- это семантика списка инициализации. Такая семантика будет +/- общей для разных классов. Если фигурные скобки с одним значением -- просто список инициализации с одним значением.
Вижу круглые скобки -- это семантика параметров конструктора. Смысл параметров будет разный для разных классов. Надо смотреть, что там заложил автор класса.
Поэтому
vector vec{10} // вектор длины 1 со значением 10
vector vec(10) // вектор длины 10 с мусором в качестве значений
vector vec{10, 0} // вектор длины 2 со значениями 10 и 0
vector vec(10, 0) // вектор длины 10 со значениями 0
Интересный совет по проектированию интерфейсов: делать так, чтобы инициализация в круглых скобках не отличалась от инициализации в фигурных скобка. Тогда вопрос, зачем нужны разные виды скобок.
А как же обратная совместимость ?
Для того чтобы ТЫ страдал!
@@robbieazreal3192 🤣 Не, ну не так чтоб совсем страдал, но нервно оглядываться на очередной стандарт придётся )
> делать так, чтобы инициализация в круглых скобках не отличалась
Нет. См. например std::vector.
Топ видео, до этого не знал для чего именно это нужно, спасибо)
Круто, помогли, наконец, разобраться что и как работает, спасибо!!
0:50 это неправда
через знак равно это copy-list-initialization, без - direct-list-initialization, у последнего нет ограничения на вызов только implicit конструкторов. Если по правилам перегрузки выиграет explicit конструктор для случая copy-list инициализации компилятор сообщит об ошибке.
Складывается ощущение, что эти нововведения делаются так:
- всех нормальных людей всё устраивает
- какой-то задрот теоретик, далёкий от энтерпрайза: "а вот МНЕ нехватает какой-то херни, которая нахрен никому не нужна"
- разрабы плюсов : "СРОЧНО ВЫПУСКАЕМ ОБНОВЛЕНИЕ"
- задрот доволен, нормальные люди страдают
Ух ты, мне понравилось!
Молодец, четко изложил вопрос!
Лайк, пиписка. 🎉
Я мимокрокодил, потому что синтаксиса такого не видел (не пишу на плюсах), но ролик на 18 минут про отличие двух строчек кода... Вау
@@tgitw-tq6iu невозможно объяснить за 3 минуты?
Создатели C++ забыли для чего нужен любой язык программирования - для решения прикладных/бизнес задач, вместо этого они решают проблемы самого C++
Ждём Carbon
Неточно. Точнее будет: решают проблемы языка, одновременно создавая ворох новых.
Юзаю в своем уголке С++98 и счастлив.
Хаха я пару раз попадался на ошибку о которой Майерс говорил, уж не знаю почему, то ли сонный был, то ли надо меньше между разными языками переключаться. Когда переключаешься часто между с++, питоном(для какой-то автоматизации), cmake, JS(QML), lua(игровой движок), java(для дерганья андроид SDK) начинается каша в голове и пишешь уже на каком-то своем абстрактном языке и компилятор может сильно ему удивляться, и сам вслед за ним ))
супер контент 😉
С приведением типов всегда была проблема в языке. Поэтому у нас есть explicit
Фигурная инициализация - интересная тема, хорошо осветил список инициализации (как мне кажется не стоило ломать язык и двадцать минут назвать его "инищиалайзер лист". В целом, лайк конечно
Почти всё я знал, кроме конфликтов с std::initializer_list. Меня удивило то, что в ютубе такие темы освещаются
8:10 Не знал. Крутяк!
"19 различных способов инициализировать int" - это вам не это. Есть классная статья на Хабре "Инициализация в современном C++", от которой теоретики в ужасе, как на ЭТОМ можно кодить. Зато практики такими вопросами не задаются, т.к. любят/вынуждены ходить по граблям и веруют в то, что кодируют без ошибок и UB. Иногда их в этом пытаются разубедить статические анализаторы, санитайзеры, паники, крэшы и хакеры. Особенно весело, когда в новом релизе стандарта опять что-то улучшили.
Неожиданно, про С++ мне рассказывает Кевин ДеБрюйне ))
блин. точно )))
5:15 Ничего там не заменится, там сначала вычислится 5.8, а уже потом, при последующей попытке сужения этого значения, и произойдёт ошибка.
15:02 А второй элемент равен не 2-м.
А вот вас я бы с удовольствием взял на работу над реально серьезными задачами.
Молодец!
@@dmitriyv4557 взяли бы из-за элементарного замечания?
@@wsxpocxeafx за внимательность. Это крайне важная черта характера для хорошего разраба.
А warning'и по поводу ambiguity вызовов выдаются? Или втихушку гадит?
Где автор был раньше?!??!? Спасибо большое за видео!
реально годно
Наверное, надёжней использовать конструкцию вида
auto value = ValueType(Args...)
Синтаксис c++ превратился в цыганский табор, и ощущается он не как язык программирования, а как русский язык, где в каждом правиле есть свои особенности и, чтобы действительно разобраться во всех тонкостях, надо положить жизнь на это. Мне кажется для этого языка уже нет хорошего применения в новых проектах, которые не зависят от старого кода.
По твоему есть что-то лучше С++, rust, python или может C ?
Я конечно понимаю что каждый язык программирования лучше в определенной сфере, но в данном случае что лучше чем С++??
@@book1738 для низкого уровня - си, чтобы на нём для конкретной платформы написать LISP-машину для прикладного программирования
А что ты хотел? Любая технология или наука со временем разрастается, потому что развивается и для ее изучения приходится тратить много времени. Многие вещи внедрены в целях безопасности/оптимизации и т.д.
К тому же тебя никто не обязывает использовать новейшие нововведения стандартов.
😅@@book1738
Дайте мне переопределение операций в джаву!!!
2:10. Почему на этом моменте компилятор не сгенерировал оператор перемещения или конструктор перемещения? Потому что есть явно определенный конструктор копирования или оператор копирования?
На сколько мне move семантика применяется когда объект является rvalue значением то есть временным объектом
Потому что передаётся lvalue
Фигурные скобки это старая добрая агрегатная инициализация из С. Просто ее применение несколько расширили.
Досмотрел до конца, пропало желание учить C++ 😂
Учить C++ следует только в одном случае.
Когда соблюдено одно важное условие.
Условие простое: необходимо любить C++.
В остальных случаях это будет каторга, и, в результате, ничего не получится.
@@billjohnes9380 ещё если есть необходимость его учить, например, чтобы вносить изменения в какой-нибудь OpenMW, или чтобы разрабатывать, например, игры на UE5, это первое, что в голову пришло, не знаю куда ещё плюс можно применить, когда есть C# и Kotlin, каждый по своему хорошо. Второй крут корутинами, Compose Multiplatform и коротким синтаксисом, а C# поддерживается мировым гигантом, постоянно развивается и ближе к плюсам по возможностям, на мой субъективный взгляд, чем Kotlin.
ijnpsdgnbfds ljhtheagw ajpinwgesns;grtegawfqlejsnfglaegjkfwn egcljkxzgrnzdghjlk`tNAg bdjzghkef3bnrsz egjkrgkfawEszgrbiegjsabizdfjrgsken
ещё если есть необходимость его учить, например, чтобы вносить изменения в какой-нибудь OpenMW, или чтобы разрабатывать, например, игры на UE5, это первое, что в голову пришло, не знаю куда ещё плюс можно применить, когда есть C# и Kotlin, каждый по своему хорошо. Второй крут корутинами, Compose Multiplatform и коротким синтаксисом, а C# поддерживается мировым гигантом, постоянно развивается и ближе к плюсам по возможностям, на мой субъективный взгляд, чем Kotlin.
@@billjohnes9380 ______________
ещё если есть необходимость его учить, например, чтобы вносить изменения в какой-нибудь OpenMW, или чтобы разрабатывать, например, игры на UE5, это первое, что в голову пришло, не знаю куда ещё плюс можно применить, когда есть C# и Kotlin, каждый по своему хорошо. Второй крут корутинами, Com_pose Multip_latfo_rm и коротким синтаксисом, а C# поддерживается мировым гигантом, постоянно развивается и ближе к плюсам по возможностям, на мой субъективный взгляд, чем Kotlin.
@@billjohnes9380 прошлое сообщение адресовано тебе. Не справшивай почему всё так 🤣🤦♂🤦♂🤦♂
"Скотт Майерс называет это примером плохого дизайна интерфейса..." Не хочу хейтить, но раз язык позволяет, значит это зачем-то нужно. Но в принципе мне ролик понравился. Уже лет 25 не программировал на C++ по серьёзному, а хочется вернуться. Достаточно легко слушать видео и визуализация лёгкая для понимания.
Кстати, а что за редактор кода?
Редактор - Qt Creator
Страхотно видео.
Абонирах се за канала, и изгледах всичките ти видеа. Много са полезни и информативни. Бихте ли обяснили промените в С++ 20 и 23? Как могат да се използват модулите въведени със С++/20? Каква е ситуацията с общодостъпни модули включващи стандартната езикова библиотека?
Извинете за отвратителната граматика (предполагам е отвратителна), но използвам гугъл преводач, понеже руския ми е много слаб.
В рукомендациях залетел твой канал, очень круто делаешь! Подумай о том, чтобы сделать видео о rvalue ссылках. Ни одно видео мне не дало 100 процентного понимаю что да как
Круто, поддержу комментарием
1:40
Не будет вызван конструктор копирования, эта строка буквально идентична предыдущей. Будет точно так же вызыван только конструктор, соответствующий параметрам в списке инициализации.
для int(int) это и будет конструктор копирования. а дальше он приводит пример с кастомным классом, и это подводка к этому примеру
@@z140140 примеры принципиально различаются.
@@z140140Примеры принципиально различаются. В первом случае, аналогично как если бы переменная инициализировалась возвращаемым из функции значением, произойдет элизия копирования. Эта оптимизация существует 25 лет и включена по умолчанию даже на О0 во всех компиляторах.
Мне кажется он похож на чела Simple Code , но более продвинутой версии
Интересно, на сколько инициализация в Rust лучше только что рассказанного шаманства в современном C++?
ни на сколько.
@@MakarenkoSasha Что-то я там такого шаманства не прироминаю. А вы?
@@prayer4675 просто для меня это не шаманство.. видимо 25 лет с++ оставляют отпечаток.
Просто раст такого делать не умеет, вот вы и не припоминаете
@@AlexAlex-jk2tn Ну а зачем шаманить, когда нужно просто проинициализировать?
1:32 - и зачем это, интересно, при работе с пользовательским классом нужно знать когда конструктор копирования, а когда оператор присваивания? у нормальных классов это одно и то же, порой реализовано одно через другое. если пользовательский класс написан о4ком и там оно разное - то это плохой класс, не используйте его или перепишите, с ним будет только больше проблем.
и не нужно, наяривать на свои скобки, компилятор все сделает за вас. разницу имеет смысл смотреть только в конечном собранном коде. все остальные рассуждения - ниач0м. в стандарте может быть написано что угодно, а компилятор сделает совершенно другое и оптимизированное. один компилятор сделает одно, другой - другое.
👍🏻
У вас такой отличный голос. Не пробовали быть диктором?
Топ контент
Std initializer list и все эти неявные касты типов ломают статическую типизацию
Какой это редактор кода?
QtCreator
конструкторы это ошибка language disign, как и исключения. хорошо, что есть языки, где это пофиксили
Вот это топ видос! Я стал умнее! Наверное. Спасибо!
Какие-то странные сущности, и их назначение не очевидно. Теперь понятно, почему многие ругают плюсы.
Слишком много всего в плюсах
fifine am8
Когда интересно но не понятно
Высококачественная подача материала и хорошая речь.
Я .net разработчик, зачем я это смотрю 😂
Ну как, теперь ты знаешь, что и в С++ подналожили синтаксического сахара, и есть масса возможностей сбить с толку новичков совершенно тривиальными вещами, записанными через задницу. 😊
А нада быть .da разработчиком
8:30 вы не последовательны))) : data(initList) {} => : data{initList} {}
А потом они рассказывают, что в js не интуитивное преобразование типов и сравнение == 😂🤣🤣
я вот 35 секунд смотрю, у меня 2 раза уже стул сгорел подо мной.. программисты епт
Что не так?
После подобных видио появляется желание сделать свой собственный яп, такой-же быстрый и низкоуровневый как С/С++, но намного проще, чисто из-за того что будет вырезано большенство бесполезного/заменяемого функционала. Думаю лет через 20 - 30 сделаю. А то я только новичок не сильно шарю. Вдруг всë что я считаю бесполезным на самом деле необходимо.
Есть же ASM он реально выглядит попроще )
@@diez4005 в нëм на самом деле тоже много лишнего если бы мог то и его переделал но тогда возможно и сам процессор придëтся переделовать мне на подобное жизни не хватит
@@Hobby2007 а не мог бы ты заодно переделать ткань вселенной и заодно человеческую природу так, чтобы не было ни пороков, ни зла, ни смерти?
@@Kalin_cheetah звучит тяжело
@@tgitw-tq6iu естественно я не знаю что такое ЦПП, и ни кто мне про него раньше не говорил. Загуглил вот: ЦПП - Центр Поддержки Пользователей:) Но если ты имел ввиду Центральный Процессор, то я лишь поверхностно представляю его архитектуру, и мне в этом ещё предстоит разобраться.
Я в шоке что у программистов на С++ такие же вопросы как и у нас бедных плебеев с других языков
Мда уж. Неявное преобразование в сях это жесть
Это да, те ещё фокусы, но есть полезный кейворд explicit
2024 year. New concept... Lol...
я не знаю, может только у меня такая проблема, но микрофон очень бьёт в уши