C++ — итоги
Кратко — что стоит унести из раздела "C++". Если пункт кажется туманным — откройте указанную главу или оглавление.
FAQ — Часто задаваемые вопросы
Типичные сбои и ситуации, с которыми сталкиваются новички при работе с C++. Здесь — что делать и где копать в главах; определения для зачёта — в чек-листе.
Вопрос. Компиляция прошла, линковщик пишет undefined reference to 'main' или к функции из другого файла.
Ответ. Объектные файлы не слинкованы — забыли добавить .cpp в сборку, не подключили библиотеку (-l), или объявление есть в .h, а реализация в .cpp не попала в проект. Подробнее здесь — сборка, CMake, первая программа.
Вопрос. Линковщик: multiple definition of … — один символ описан дважды.
Ответ. Определение функции или глобальной переменной лежит в заголовке без inline/static и подключено из нескольких .cpp. Перенесите реализацию в один .cpp или используйте inline для функций в header-only стиле. Подробнее здесь — заголовки, функции.
Вопрос. Программа падает с Segmentation fault сразу после delete или выхода из функции.
Ответ. Классика — double free, use-after-free или обращение к локальной переменной через висячий указатель. Предпочитайте std::unique_ptr, RAII и контейнеры вместо голых new/delete. Подробнее здесь — память, идиомы.
Вопрос. Итератор vector "ломается" после push_back в цикле.
Ответ. Рост vector может переместить элементы в новый буфер — старые итераторы и ссылки недействительны. Сохраняйте индекс или зарезервируйте reserve(). Подробнее здесь — ООП и STL, типы.
Вопрос. Проект собирается минутами — каждый раз перекомпилируется половина файлов.
Ответ. Тяжёлые заголовки (iostream, большие шаблоны) включены везде — вынесите объявления в .h, реализацию в .cpp, используйте forward declaration и PCH. Подробнее здесь — сборка, компиляторы.
Вопрос. g++ есть, а CMake пишет "No CMAKE_CXX_COMPILER could be found".
Ответ. Компилятор не в PATH или не установлен metapackage build-essential / Xcode CLT. Укажите -DCMAKE_CXX_COMPILER=... или установите полный toolchain. Подробнее здесь — CMake, задания.
Вопрос. На macOS: 'iostream' file not found при #include <iostream>.
Ответ. Не установлены Command Line Tools или активен только stub-компилятор. Выполните xcode-select --install, перезапустите терминал. Подробнее здесь — первая программа, что знать перед C++.
Вопрос. Valgrind показывает "definitely lost" — это точно утечка?
Ответ. Память выделили через new/malloc и не освободили до выхода. На Windows Valgrind нет — используйте AddressSanitizer (-fsanitize=address) или встроенный отладчик CRT. Подробнее здесь — память, RAII.
Вопрос. Рекурсия падает с stack overflow на "небольшой" глубине.
Ответ. Стек потока ограничен — глубокая рекурсия без базового случая его переполняет. Перепишите на цикл или явный std::stack. Подробнее здесь — функции, архитектура выполнения.
Вопрос. Предупреждение "comparison of signed and unsigned" — можно игнорировать?
Ответ. При больших значениях знаковое число превращается в огромное беззнаковое — цикл может никогда не завершиться. Приведите типы явно (static_cast) или используйте std::ssize. Подробнее здесь — операторы, типы.
Вопрос. Передал объект по значению в функцию — снаружи поля "обрезались".
Ответ. Это object slicing при передаче производного класса как базового по значению. Передавайте по const& или указателю/ссылке на базовый тип. Подробнее здесь — ООП, наследование.
Вопрос. Базовый указатель delete без virtual destructor — краш при выходе.
Ответ. Без virtual ~Base() вызывается только деструктор базы — ресурсы производного класса не освобождаются. Для полиморфной иерархии деструктор базы всегда virtual. Подробнее здесь — ООП, идиомы.
Вопрос. char* vs std::string — когда что использовать новичку?
Ответ. В современном C++ для текста берите std::string/string_view; сырые указатели — для C-API и низкоуровневого кода. Смешение без явной длины ведёт к buffer overflow. Подробнее здесь — типы и string, системное программирование.
Вопрос. Шаблонная ошибка на 50 строк — как вообще читать такой вывод?
Ответ. Ищите первую строку "instantiation of …" с вашим типом — там настоящая причина; остальное — цепочка SFINAE. С C++20 концепты сокращают "стены текста". Подробнее здесь — ООП и шаблоны, углублённые темы.
Вопрос. Учебник требует Boost для "Hello World" — это нормально?
Ответ. Для первых шагов Boost не нужен — хватит стандартной библиотеки C++17. Boost подключайте точечно (filesystem, asio) после базы. Подробнее здесь — экосистема, что знать перед C++.
Вопрос. Qt-проект в Creator собирается, а cmake --build на другой машине — нет.
Ответ. Разные генераторы, пути к Qt, версии kit и отсутствие CMAKE_PREFIX_PATH. Зафиксируйте версию Qt и экспортируйте окружение в README или используйте vcpkg/Conan. Подробнее здесь — Qt, CMake.
Вопрос. В Debug всё стабильно, Release падает "случайно".
Ответ. Частые причины — неинициализированные переменные, гонки данных, UB, которые оптимизатор "прячет" в Debug. Включите sanitizers и воспроизведите в Release с символами. Подробнее здесь — потоки, память.
Вопрос. DLL/so, собранная MinGW, не грузится в MSVC-проекте (и наоборот).
Ответ. Разные компиляторы дают несовместимый ABI — линкуйте библиотеки тем же toolchain, что и основной проект, или используйте чистый C API на границе. Подробнее здесь — язык системного программирования, сборка.
Вопрос. После std::move(x) объект x всё ещё нужен — данные пропали.
Ответ. После move объект в валидном, но неопределённом состоянии — им можно только присвоить или уничтожить. Не читайте "перемещённые" данные. Подробнее здесь — идиомы, память.
Вопрос. Программа с потоками иногда выдает мусор в переменной — "не воспроизводится".
Ответ. Классическая data race без синхронизации. Защитите общие данные std::mutex, std::atomic или передавайте копии между потоками. Подробнее здесь — многопоточность, асинхронность.
Вопрос. -std=c++20 в флаге, а компилятор ругается на requires или std::format.
Ответ. Старая версия GCC/Clang/MSVC не поддерживает полный C++20 — обновите компилятор или понизьте стандарт до C++17 для учебного проекта. Подробнее здесь — вводная, диапазоны.
Вопрос. Подключил windows.h — min/max ломают std::min.
Ответ. WinAPI определяет макросы min и max. Определите NOMINMAX перед include или оберните вызов в скобки (std::min)(a,b). Подробнее здесь — операторы, системное программирование.
Вопрос. Нужно ли сначала учить C, потом C++?
Ответ. Для современного C++ отдельный курс C не обязателен — начинайте с C++17 и STL. C пригодится позже для embedded и чтения legacy. Подробнее здесь — что знать перед C++, первая программа.
Вопрос. Исключение "пролетело" через границу DLL — программа просто упала.
Ответ. Исключения через границы модулей с разным runtime/компилятором небезопасны. На границе API возвращайте код ошибки или ловите всё внутри DLL. Подробнее здесь — исключения, иерархия.
Вопрос. dynamic_cast вернул nullptr, хотя "объект точно этого типа".
Ответ. Нет virtual-функций в базе (RTTI отключён) или указатель уже испорчен (UB раньше). Включите -frtti/не используйте /GR- без понимания. Подробнее здесь — RTTI, ООП.
Вопрос. Стоит ли новому проекту брать C++ или сразу Rust?
Ответ. C++ — если нужна экосистема игр/Qt/legacy и команда уже знает язык; Rust — для новых систем с упором на безопасность памяти. Для учебника C++ даёт понимание "железа" и STL. Подробнее здесь — углублённые темы, Rust.
Вопрос. Практические задания из раздела не сходятся с моим компилятором на Windows.
Ответ. Сверьте версию MSVC/GCC, стандарт (/std:c++17 или -std=c++17) и что запускаете из той же папки, что в заданиях. Часто помогает чистая папка build/. Подробнее здесь — практические задания, CMake.
Вопрос. Хочу игры — сразу Unreal или сначала "голый" C++?
Ответ. Базовый C++ (типы, память, классы, STL) сильно упростит Unreal — иначе Blueprint и макросы UCLASS будут чёрным ящиком. Короткий маршрут — игры после заданий. Подробнее здесь — разработка игр.
Вопрос. Как установить C++ на Windows 10 / 11?
Ответ. Поставьте Visual Studio Community с workload "Разработка классических приложений на C++" или Build Tools + MSVC; альтернатива — MSYS2/MinGW-w64. Проверка: g++ --version или сборка Hello World. Подробнее здесь — первая программа, компиляторы.
Вопрос. Как скомпилировать программу на C++ через g++?
Ответ. g++ -std=c++17 main.cpp -o app, запуск ./app (Linux/macOS) или app.exe (Windows). Несколько файлов перечислите в команде или соберите через CMake. Подробнее здесь — первая программа, сборка.
Вопрос. C++ для начинающих с нуля — с чего начать?
Ответ. Маршрут: что знать перед C++ → первая программа → типы, операторы, циклы → функции и память → STL. В разделе — таблица этапов в intro. Подробнее здесь — язык системного программирования.
Вопрос. Чем C++ отличается от языка C?
Ответ. C++ расширяет C: классы, шаблоны, STL, RAII, перегрузка функций. Валидный C часто компилируется как C++, но идиомы разные — современный C++ не сводится к "C с классами". Подробнее здесь — вводная, ООП.
Вопрос. C++ или Python — что учить для программирования?
Ответ. Python быстрее для скриптов и данных; C++ — для игр, движков, embedded и высокой производительности. Многие проходят Python первым, затем C++ для "железа". Подробнее здесь — дорожная карта, Python — о разделе.
Вопрос. Segmentation fault (segfault) — что это в C++?
Ответ. Обращение к недопустимой памяти — nullptr, выход за границы, use-after-free. Отладчик покажет строку; помогают sanitizers и умные указатели. Подробнее здесь — память, идиомы.
Вопрос. Как выучить C++ самостоятельно?
Ответ. Теория из раздела + ежедневный код + практические задания. Не прыгайте сразу в Unreal/Qt без типов и STL. Подробнее здесь — intro, чек-лист.
Вопрос. std::vector в C++ — как пользоваться?
Ответ. Динамический массив: push_back, size(), индекс v[i], range-for. Для вставки в середину — insert; заранее reserve(n) при известном размере. Подробнее здесь — ООП и STL, типы.
Вопрос. unique_ptr и shared_ptr — в чём разница?
Ответ. unique_ptr — единственный владелец; shared_ptr — счётчик ссылок для совместного владения; weak_ptr ломает циклы. По умолчанию выбирайте unique. Подробнее здесь — память, идиомы.
Вопрос. C++17 — что нового для новичка?
Ответ. std::optional, string_view, structured bindings, if constexpr, файловая система в STL. В курсе большинство примеров на C++17. Подробнее здесь — вводная, углублённые темы.
Вопрос. CMake проект C++ с нуля — как создать?
Ответ. Файл CMakeLists.txt, cmake -B build, cmake --build build. Укажите CMAKE_CXX_STANDARD 17. Подробнее здесь — CMake, сборка.
Вопрос. Нужен ли C++ для Unreal Engine?
Ответ. Для геймплея и оптимизации — да, C++; прототипы можно на Blueprint, но серьёзные проекты требуют кода. Базу C++ лучше пройти до глубокого UE. Подробнее здесь — игры на C++, разработка игр.
Вопрос. Qt C++ — что это и зачем?
Ответ. Qt — фреймворк для desktop/mobile GUI, сети и мультимедиа на C++. Используют в промышленности, CAD, встраиваемых панелях. Подробнее здесь — Qt, Qt Widgets.
Вопрос. Сколько учить C++ до junior разработчика?
Ответ. C++ длиннее Python: на базу часто уходят 4–8 месяцев при регулярной практике; junior в gamedev/embedded — плюс проекты и STL. Подробнее здесь — карьера в IT, задания.
Вопрос. C++ или Rust — что учить в 2025?
Ответ. C++ — если цель Unreal, Qt, legacy, собеседования в gamedev; Rust — новые системные сервисы с упором на безопасность памяти. Подробнее здесь — углублённые темы, Rust.
Вопрос. Ошибка линковки undefined reference — как исправить?
Ответ. Добавьте .cpp с реализацией в сборку или флаг -lимя_библиотеки. Объявление в .h без .cpp даёт именно эту ошибку. Подробнее здесь — сборка, Начало работы с C++ — линковка.
Вопрос. ООП в C++ — класс и наследование для начинающих.
Ответ. class с модификаторами public/private, конструктор, virtual для полиморфизма, override в наследниках. Подробнее здесь — ООП, композиция.
Вопрос. Лямбда-функции в C++ — синтаксис и пример.
Ответ. [capture](params) { body } — удобны для STL-алгоритмов и колбэков. [&] захватывает по ссылке, [=] по значению. Подробнее здесь — функции и лямбды.
Вопрос. Многопоточность C++ std::thread — с чего начать?
Ответ. std::thread + join, общие данные под std::mutex, для задач — std::async. Сначала теория процессов/потоков. Подробнее здесь — многопоточность, асинхронность.
Вопрос. C++ в Visual Studio — как создать проект?
Ответ. "Создать проект" → Консольное приложение C++ → F5 для сборки и запуска. Для CMake — шаблон "CMake Project". Подробнее здесь — первая программа, сборка.
Вопрос. Что такое STL в C++?
Ответ. Standard Template Library — контейнеры (vector, map), алгоритмы (sort, find), итераторы, string. Ядро современного C++ вместо ручных массивов. Подробнее здесь — ООП и STL, справочник.
Вопрос. RAII в C++ — что это простыми словами?
Ответ. Ресурс (память, файл, mutex) привязан к времени жизни объекта: в конструкторе взяли — в деструкторе освободили. Основа unique_ptr и fstream. Подробнее здесь — идиомы, память.
Вопрос. Как установить C++ на Mac (Apple Silicon)?
Ответ. Xcode Command Line Tools (xcode-select --install), затем clang++ или Homebrew gcc. Для Qt/CMake — отдельные формулы brew. Подробнее здесь — первая программа, компиляторы.
Вопрос. Игры на C++ без движка — реально ли?
Ответ. Да, через SDL2, SFML, Raylib, Siv3D — учебные 2D/3D-игры; для GPU API — OpenGL, DirectX, Vulkan. AAA используют Unreal/свои движки на C++. Подробнее — игры, SFML, SDL, Raylib, OpenGL, Vulkan.
Вопрос. C++ самый быстрый язык — правда?
Ответ. C++ даёт нативный код и контроль памяти — среди языков общего назначения он в топе по скорости; Rust и Fortran конкурируют в нишах. Скорость зависит от алгоритма и сборки (Release, -O2). Подробнее здесь — вводная, оптимизация.
Что запомнить
C++ — это мультипарадигменный, компилируемый язык программирования, разработанный как расширение языка C с добавлением возможностей объектно-ориентированного и обобщённого программирования. Он сочетает в себе низкоуровневый контроль над ресурсами (памятью, процессором) и высокоуровневые абстракции, что делает его подходящим для системного программирования, высокопроизводительных приложений и встраиваемых систем.
Основные области применения C++:
- Системное программирование — операционные системы, драйверы, ядра;
- Игровая индустрия: движки (Unreal Engine), клиенты и серверы игр;
- Высокочастотный трейдинг и финансовые системы;
- Встраиваемые системы и IoT: микроконтроллеры, устройства реального времени;
- Научные вычисления и симуляции — физика, биоинформатика, численные методы;
- Инфраструктурное ПО — базы данных (MongoDB, ClickHouse), компиляторы, браузеры (Chrome, Firefox).
Ключевые особенности языка:
- Прямой контроль над памятью: ручное выделение (
new/delete) или управление через умные указатели; - Нулевая стоимость абстракций: высокоуровневые конструкции не накладывают накладных расходов в рантайме;
- Строгая статическая типизация с мощной системой шаблонов;
- Поддержка множественных парадигм — процедурная, ООП, обобщённое, функциональное программирование;
- RAII (Resource Acquisition Is Initialization) — идиома управления ресурсами через время жизни объектов;
- Многопоточность на уровне стандарта — начиная с C++11;
- Стандартная библиотека (STL) — контейнеры, алгоритмы, итераторы, строки, потоки.
Эволюция языка прошла ключевые этапы:
- C++98/03 — классическая версия с STL;
- C++11 — революционное обновление — лямбды,
auto, умные указатели, многопоточность; - C++14/17 — уточнения и удобства —
constexpr,if constexpr, structured bindings; - C++20 — концепты, модули, корутины, диапазоны;
- C++23 — дальнейшее развитие: улучшения стандартной библиотеки, поддержка UTF-8.
Три основных правила эффективной работы с C++:
- Предпочитать автоматическое управление ресурсами (умные указатели, RAII) ручному;
- Использовать современный C++ (C++17 и выше) вместо устаревших практик;
- Избегать неопределённого поведения — проверять границы, не использовать неинициализированные переменные, соблюдать правила aliasing.
Три фундаментальных момента:
- C++ — это язык, где производительность и контроль достигаются ценой сложности;
- Его сила — в возможности писать код, который работает "как железо", но читается как высокоуровневая модель;
- Знание стандартной библиотеки и идиом (move semantics, copy-and-swap, CRTP) критически важно для качественного кода.
Куда идти дальше
| Тема | Раздел |
|---|---|
| "Системное программирование на C++" | "Системное программирование на C++" |
| "Rust — о разделе" | "Rust — о разделе" |
| "Оптимизация размера и производительности приложений" | "Оптимизация размера и производительности приложений" |
| "Ассемблер — о разделе" | "Ассемблер — о разделе" |
Проверьте себя: Чек-лист самопроверки.