Comments 41

Сразу вспоминается старый добрый мем)
Страуструп действительно не самый удачный вариант для начинающего. Вместо того, чтобы пояснять на простеньких коротких примерах, он начинает писать одну большую программу на протяжении всей книги, причём куски кода нередко сопровождаются текстом вроде "вот, мы написали несколько функций для того-то и того-то, но этот код пока что не работает, а чтобы он заработал, нам надо..." - для новичка хуже не придумаешь. Да и примеры у него написаны как правило на С с классами, а не на С++.
Я знакомился с языком так: взял Прата как основную книгу и параллельно читал ещё две-три. Выглядит это так: читаешь у Прата такой-то параграф, ищешь эту же тему в других книгах и читаешь там. Это даёт более объёмное понимание.
Ну и да, чатботы в помощь. С++ это старый зрелый язык, по нему мегатонны материалов, так что ИИшки владеют им неплохо. Но нужно быть точным в промптах, потому что тот же чатгпт любит навернуть сырых указателей и прочей порнографии без острой на то надобности. Лучше прямо требовать код в духе последних стандартов.
Как выучить С++ за 21 Полярный день.
Это был бы топчик и к тому же реалистичный.
Было бы неплохо сделать обзор может даже по условным git-проектам где есть примеры решения задач где используются концептуальные преимущества языка или по содержанию "диска прилагаемого к книге". В основном сейчас лучше изучить концепции из разряда "наследование - это неявное дополнительное поле типа, соответствующее номеру класса по желанию компилятора плюс массив указателей на процедуры или switch-case, реализующие виртуальные функции согласно этому полю", "рекурсия - это неявный стек, который располагается не совсем вручную", ну и разумеется механизмы лямбда, различных темплейтов что это не просто синтаксический сахар и форма макросов, и, конечно же, dynamic_cast и как правильно его готовить чтобы не было сегфолтов.
наследование - это неявное дополнительное поле типа, соответствующее номеру класса по желанию компилятора плюс массив указателей на процедуры или switch-case, реализующие виртуальные функции согласно этому полю
У меня немного над глазом задёргалось после этой фразы. Речь ведь шла про не про любое наследование, а при наследование при наличии виртуальных функций, да?
Именно так за небольшим нюансом. Г. Буч (ООП с использованием С++) подвёл некий базис под это и не отделяет наследование от поведения объектов (т. е. виртуальные функции обязательны, хотя бы одна), которые обладают состоянием, поведением и идентичностью. Иначе это просто структура в структуре и в полной мере им не является, хотя и допустимо, но это весьма условно. То есть при отсутствии наследования функций технически компилятор может не вводить неявное поле типа (идентификатор) в класс (ad-hoc полиморфизм и перегрузка также не задействует этот механизм). Кстати в нулевые были ещё пара ключевых книг, которые основательно определяли то что указано автором темы и кристаллизовали те проблемы, которые актуальны до сих пор вот уже на протяжении третьего десятка лет: С. Мейерс "Наиболее эффективное использование C++. 35 новых рекомендаций по улучшению ваших программ и проектов". И ещё одно издание этого же автора "Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ". Вот там как раз взаимосвязь языка с файловой системой, проблемы с компиляцией, то есть то что выходит за рамки языка и отнимает кучу времени в плане организации процесса проектирования.
Ваша статья прямо в яблочко для меня!
Мне было "надо". Хотел перейти в Unreal engine после довольно продолжительного опыта в веб играх.
Хотел освоить с наскока, стал задачки на codewars на C++ делать. Но довольно быстро понял, что ничему там не учусь именно в плане языка.
Стал читать Страуструпа, третье издание на английском. Очень муторно, согласен, что для новичка это так себе вариант. В итоге сейчас использую его скорее, как справочник, когда попадётся очередная непонятная штуковина в ответах нейрочатов.
Стал писать свой 3d движок. Пригодится для понимания того, как готовые движки работают. И для упражнений отличный вариант!
В итоге пользуюсь deepseek, Страуструпом и книгой по игровым шаблонам проектирования Game Programming Patterns с примерами на C++
Вообще заметил, что во многие облости как-то проще заходить с нуля. Например для андроид разработки и котлина есть суперские справочные материалы и уроки от гугла и intelij. Для go и python есть какие-то уроки прямо на их официальных сайтах. И если по ним не станешь мастером, то хотя бы базу, чтобы другие материалы заходили проще, получишь. А вот откуда начинать с C++ - действительно вопрос хороший
Интересно почему нет ни одной статьи о том как выучить математику, диф-уры,матанализ, ...
Там тоже много чего интересного.
Хорошо, что ты решил восполнить пробелы в математике! Это вполне реально, если двигаться систематично и последовательно.
Программа обучения математике «с нуля»
1. Базовый уровень (школьная математика)
Цель: Освоить арифметику, алгебру, геометрию и основы тригонометрии.
Темы:
Арифметика
Натуральные числа, дроби, проценты.
Отрицательные числа, модуль числа.
Степени и корни.
Пропорции, простые уравнения.
Алгебра
Линейные уравнения и неравенства.
Квадратные уравнения (дискриминант, теорема Виета).
Системы уравнений.
Многочлены, формулы сокращённого умножения.
Геометрия
Основные фигуры (треугольник, окружность, четырёхугольники).
Теорема Пифагора.
Площади и объёмы.
Подобие треугольников.
Тригонометрия
Синус, косинус, тангенс.
Основные тригонометрические тождества.
Простейшие тригонометрические уравнения.
Рекомендуемые учебники:
«Математика» (5-6 класс) — Виленкин Н.Я.
«Алгебра» (7-9 класс) — Макарычев Ю.Н., Миндюк Н.Г.
«Геометрия» (7-9 класс) — Атанасян Л.С.
«Как научиться решать задачи» — Фридман Л.М. (для понимания логики решения)
Практика:
Решать задачи из школьных учебников.
Использовать сайты: «Решу ОГЭ» (https://oge.sdamgia.ru/), Khan Academy (https://www.khanacademy.org/).
2. Средний уровень (углублённая школьная + начало высшей математики)
Цель: Подготовиться к более сложным темам (матанализ, линейная алгебра).
Темы:
Функции и графики
Линейная, квадратичная, степенная функции.
Показательная и логарифмическая функции.
Тригонометрические функции.
Начала математического анализа
Пределы функций (интуитивное понимание).
Производная (физический и геометрический смысл).
Интеграл (понятие и простейшие применения).
Элементы комбинаторики и теории вероятностей
Основные формулы (перестановки, сочетания).
Вероятность событий.
Рекомендуемые учебники:
«Алгебра и начала математического анализа» (10-11 класс) — Колмогоров А.Н.
«Функции и графики» — Гельфанд И.М., Глаголева Е.Г., Шноль Э.Э.
«Математика для гуманитариев» — Садовничий В.А. (если нужно мягкое введение)
Практика:
Онлайн-курсы: Coursera («Введение в математический анализ»).
Задачи на Wolfram Alpha для проверки решений.
3. Продвинутый уровень (вузовская математика)
Цель: Освоить основы высшей математики для технических и экономических специальностей.
Темы:
Математический анализ
Пределы (строгое определение).
Дифференцирование и интегрирование.
Ряды (числовые, степенные).
Линейная алгебра
Матрицы, определители.
Системы линейных уравнений.
Векторные пространства.
Дифференциальные уравнения
Простейшие ДУ (разделяющиеся переменные, линейные).
Рекомендуемые учебники:
«Курс математического анализа» — Кудрявцев Л.Д. (том 1).
«Линейная алгебра» — Ильин В.А., Позняк Э.Г.
«Высшая математика для чайников» — Письменный Д.Т.
Практика:
MIT OpenCourseWare (бесплатные лекции).
Stepik (курсы по матанализу).
Советы по обучению
✅ Регулярность — лучше 30 минут в день, чем 5 часов раз в неделю.
✅ Практика — математика учится через задачи.
✅ Понимание, а не заучивание — старайся разбираться в сути, а не запоминать формулы.
✅ Используй визуализацию — графики, 3D-модели (Desmos, GeoGebra).
Если хочешь, могу подсказать более узконаправленные ресурсы (например, для программистов, экономистов и т. д.). Удачи в изучении! 🚀
тут неплохо обьясняется вроде что-то Coordinate-Systems
Советы из CppCoreGuidelines начинаешь ценить только после тяжёлой практики, когда успел подебажить всякое г..но из-за того что кто-то когда-то утверждал что эти советы избыточны.
Довелось раз послушать этого Константина, его безграмотность и упертость впечатлила, нашли тоже кого советовать
Куда можно устроиться Junior C++, если есть опыт на других языках, и пет-проекты на C++?
Правильно, никуда.
Ну почему же. В регионах полно вакансий на C/C++, где достаточно опыта всего в 5 лет. Всякие пром. железки, датчики, кассы, СКУДы и т.д. Но платят 25000-30000, правда не в USD.
Так что да. Здесь никуда.
Четвертую работу в Москве меняю, и только на нынешней совсем нет джунов. Полно вакансий в оборонке. Зарплата там, правда, не очень, но я знаю ребят, которые набирались опыта и уходили дальше.
К сожалению, у нас в стране очень узкий коридор для специалистов на плюсах. Геймдева нет, разработку бека на них тоже почти никто не делает, без qt нормального интерфейса не запилить, остальные фреймворки боль. Остаётся красноглазить на библиотеках и низкоуровневых решениях. Из-за этого перешёл на другие языки - боли меньше, вакансий больше. Из плюсов, простите за каламбур, потом любая типизация и дженерики как семечки
Что не так с `std::vector<bool>`?
То, что с формальной точки зрения, он не очень то и от bool - https://godbolt.org/z/e51qd1jhP
А взятие адреса от элемента вообще не скомпилируется - https://godbolt.org/z/a4WjbT3Yn
Понятно. "Тот самый" спец вздрагивает от того, что видит, что с бедным `vector<bool>`
делают)
Вот тут может быть UB с точки зрения реализации. Если bool выполнен как один бит из ячейки в 32 бита, а компилятор вдруг решил что ему достаточно 2 команды по 16 бит, то на прерываниях между этими командами возможна редкая ситуация Read-Modify-Write, при чтениях и записях флажка из асинхронных событий. Тем более этот вектор вряд ли компилятор упаковывает эти булы в битовое поле, но с другой стороны исключается возможность модификации соседнего флажка из-за этой проблемы.
при чтениях и записях флажка из асинхронных событий
а ничего, что стандарт в этой ситуации не дает вообще никаких thread safety гарантий?
ни для vector<bool>, ни для любого другого типа
Абсолютно верно. Особенно если приправить всё это register, volatile, и другими вроде как не выходящими за границы стандарта сущностями, включая карты линковки или директивы "размести элементы стандартной библиотеки в RAM, так как она быстрее флеша", контроль стека при рекурсии, при работе с оборудованием, периферией, DMA, это превращается в тот ещё квест, особенно когда появились соседние ядра. И вот тут дилемма С или С++. Вообщем С++ лучшим образом подходит скорее для статических UI, заранее заданных жёстких и строгих иерархий, обработки классов функциями требующих хорошее почти фортрановское быстродействие в одном потоке, для обработки пакетов с фиксированной иерархией данных. То есть баланс между временем на поддержание ООП, чтобы можно было что-то вклинить не сильно переписывающее весь код, файловую структуру, систему сборки, и быстродействием. Плюсовые thread-safe очереди-семафоры, мутексы, шедулеры скорее не цель а нечто, что генерируется из более высокого уровня как заведомо проверенное решение.
при работе с оборудованием, периферией, DMA
а не надо пугать меня страшными словами, у меня самого за плечами 10+ лет в embedded
тут дилемма С или С++
нету тут никакой дилеммы
если есть хороший плюсовый компилятор на платформе и соотвествующие скиллы, то C++ дает существенно больший набор возможностей, чем С
и возможности эти, мягко говоря, никак не связаны со "статическим UI" и прочим потоком сознания, который вы породили
Этот пример был приведён для того, что сложность языка дополняется сложностью задач для которых его применяют, включая аппаратуру. То есть курс "С++ за N дней для начинающих" и "С++ Embedded за M часов для юнатов" должны отличаться опытом длиной в X лет. Больше возможностей - относительно расплывчатая формулировка, например, уменьшается время внедрения новых сущностей в проект, удобство документации, командной разработки, меньшие требования к кандидатам на проект, вылавливание ошибок на этапе компиляции, простота отладки, наборы инструментов для профайлинга, визуализация данных. "Пишите программы, которые пишут программы" - (точно не помню где слоган был Керниган-Ричи или Пайк) скорее это и есть тот искомый сбалансированный инструмент для аппаратуры, наподобие GUI-генераторов инициализации контроллеров. Равно как первые плюсовые компиляторы, которые транслировали код на С. А что касается классического примера со статическим UI это скорее MFC/Borland образца 90-х с соответствующей рисовалкой ресурсов. То есть плюсы и этот подход в наибольшей мере сочетаются и не требуют особое обилие скиллов для достижения заданного результата, который даётся даже проще и быстрее чем Win32. Вообщем С++ без полного следования ООП (включая процесс проектирования на "бумаге" а-ля CRC-карточки и прочий UML) это С с классами. А также, С++ - это ещё и практически неотъемлемая инфраструктура в виде стандартной библиотеки. И именно в этом русле раскрывающий все свои преимущества, особенно, если проект дополняется сторонними средствами, без которых действительно потом страшновато разбирать и поддерживать код/данные, и не прибегать постоянно к приложениям из разряда "Understand for C++" и прочим Code Analysis.
стойкое ощущение, что общаюсь с chat gpt
потом посмотрел в профиль и все понял )
Вот кстати здесь Вы правы, что код, или текст, который был сгенерирован человеком или инструментом на основе ИИ, надо (а надо ли?) будет уметь различать. Но с точки зрения практической реализации, вполне себе можно использовать, если сформированный код компилируется и выполняет возложенные функции в заданных границах с автоматическим тестированием или имеет ключевые слова для решения задачи. Значимый результат - дообучение как обратная связь. И тут как раз сложные языки, с избыточными с точки зрения диалога с ЭВМ сущностями IMHO начинают проигрывать. Классы-наследование, функциональный подход, HDL-подобные языки, описывающие системы с событиями - это изобретения для человека, удобства проектирования и представления в голове целостной структуры проекта на языке... предметной области. Для машины не важно какие биты она перемалывает, важно то, чтобы она это делала оптимально по выбранному критерию, например, по соотношению время-память. И скорее эволюция сделает очередной виток с Basic-ом, Python-ом, обычным С, Verilog, LISP-Fortran, и даже визуальными языками такими как UML/LabView/Simulink, так как всё остальное будет отдано на растерзание оптимизатору с ИИ, благодаря гораздо более простой внутренней структуре результатов парсера в виде AST и его токенизации и к этому надо основательно готовиться.
А книги Андрея Столярова никто не использовал для знакомства с Си, Си++ ?
Он не признаёт фичи C++ после 2011 года.
Если отбросить его упоротость, то Столяров даёт очень годную базу. По сути он объясняет почему Си это максимально близкий к ассемблеру язык. После глав о Си, читателю показывается Си++ как есть, без стандартной библиотеки и почему Си++ так похож на Си, но при этом они совершенно разные языки. Получается такая крепкая выжимка из разных курсов по CS(асм, ОС, сети, информатика, чуть алгосов, lisp) которая выстраивает в голове нужную почву под все эти C++
Столярова можно рекомендовать программистам с уже имеющимся опытом реальной разработки, которые смогут отличить релевантную инфу от личных бредней автора.
Новичок скорее всего примет эти самые фанатичные бредни за чистую монету, что сильно навредит ему в реальной разработке.
Да никак. Самый минимум, года 3.
Лучше всего изучать С++ после изучения ассемблера
Три совета, как не выучить C++ за 21 день (субъективный гайд с дополнениями)