0
Обложка: Разработка на C++ с нуля в 2022 году: дорожная карта

Разработка на C++ с нуля в 2022 году: дорожная карта

Изучить программирование на C++ с нуля не так-то просто, и мы решили составить понятную дорожную карту, которая структурирует процесс обучения:

Программирование на C++ с нуля: дорожная карта

Роадмап по изучению C++ включил в себя следующие блоки:

  1. Синтаксис
  2. Объектно-ориентированное программирование
  3. Операционные системы
  4. Исключения и многопоточность
  5. Фреймворки и библиотеки
  6. IDE
  7. Выводы

Разберём каждый из них более подробно.

Синтаксис

Начнём с того, что язык С++ компилируемый, то есть трансляция кода с языка высокого уровня на инструкции машинного кода происходит не в момент выполнения, а в процессе создания исполняемого файла.

Объявление переменных в C++ стандартное, а именно:

/*тип данных*/ /*идентификатор*/;

Тип данных может быть любым, будь то int, bool или char, а переменные должны удовлетворять правилам именования переменных в C/C++. Имя переменной не должно:

  • начинаться с цифры;
  • включать символы, например  /:*?"<>|.

Всё, что начинается с символа #, в C++ называется директивами препроцессора. Каждая такая директива прописывается в отдельной строке.

Допустим, #include <iostream> подключает возможность работы с вводом с клавиатуры и выводом на экран. #include в C++ аналогична import в Java или Python.

При этом в C++, в отличие от многих других языков программирования, по умолчанию доступно мало всего. За исключением совсем базового набора, почти всё требует #include.

Пример использования:

#include <iostream>

using namespace std;

int main() {
    int a, b;
    cin >> a >> b;
    int s = a + b;
    cout << s << endl;
    return 0;
}

using namespace std подключает пространство имён std. Без этой строки многие стандартные функции, типы, переменные и многое другое надо было бы писать с префиксом std::. Так, в примере выше мы бы писали std::cin вместо cin.

Почитайте также об указателях в C++. Из статьи вы узнаете, зачем они нужны, когда использовать и чем отличаются от обращения к объекту напрямую.

А вот ссылка в языке C++ — это тип переменной , который работает как псевдоним другого объекта или значения. Всего в языке поддерживается три типа ссылок:

  1. Ссылки на неконстантные значения.
  2. Ссылки на константные значения.
  3. rvalue-ссылки.

Объектно-ориентированное программирование

Программирование на языке C++ подчиняется принципам ООП, и если вы о них не знаете, рекомендуем изучить тему с нуля и воспользоваться нашей шпаргалкой.

Об ООП на примере плюсов хорошо рассказали в этом видео:

Всё, как и в других ООП-языках. Но что ещё важно знать?

  • Конструктор — специальный метод класса для инициализации элементов класса некоторыми начальными значениями.
  • Деструктор — специальный метод класса для уничтожения элементов класса. Чаще всего используют, когдапри создании объекта класса,  в конструкторе был динамически выделен участок памяти, и эту память нужно очистить.

Перед тем, как продолжить углубление в разработку на C++ с нуля, изучите перегрузку операторов и перегрузку функций.

Операционные системы

К бинарным единицам в C++ относятся:

  1. Исполняемый файл, содержащий программу, которая может быть выполнена компьютером.
  2. Статическая библиотека — состоит из подпрограмм, которые компилируются и линкуются с программой.
  3. Динамическая библиотека — состоит из подпрограмм, которые подгружаются в программу во время её выполнения.

В плюсах предусмотрено статическое, автоматическое и динамическое выделение памяти. На последнем остановимся чуть подробнее.

Когда вы динамически выделяете память, то как бы просите ОС зарезервировать часть этой памяти для использования вашей программой. Если операционная система может выполнить этот запрос, то возвращается адрес этой памяти обратно в вашу программу. С этого момента и в дальнейшем ваша программа сможет использовать данную память. Когда память уже не нужна, возвращаете её обратно ОС для распределения между другими запросами.

В отличие от статического или автоматического выделения памяти, программа самостоятельно отвечает за запрос и обратный возврат динамически выделенной памяти.

Советуем изучить принципы работы со стеком и кучей. Также обратите внимание на рекомендации по безопасности для C++.

Исключения и многопоточность

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

throw -1; //генерация исключения int
throw ENUM_INVALID_INDEX; //генерация исключения enum
throw MyException("Fatal Error"); //генерация исключения с использованием объекта класса MyException

Поиск исключений реализовывается через стандартную для большинства языков программирования конструкцию try/catch. Блок try действует как наблюдатель в поисках исключений, которые были выброшены каким-либо из операторов в этом же блоке. catch, в свою очередь, используется для определения блока код, который обрабатывает исключения определённого типа данных.

Пример:

char *a;
try
{
  a = new char[10];
}
catch (...){
  //"a" не создан - обработать ошибку распределения памяти,
  //выйти из программы и т.п.
}
//"a" успешно создан, продолжаем выполнение

О многопоточности и соответствующих языков стандартах доступнее всего написано в документации.

Фреймворки и библиотеки

Нет, мы не случайно перепрыгнули пункт с основными навыками, который представлен в дорожной карте по программированию на C++ с нуля. Всё, что касается систем контроля версий, оформления кода, логирования и работы с cmd, — это всё общие принципы, которые необходимо освоить для работы с любым языком программирования.

Что же касается фреймворков и библиотек, это куда более специфическая тема. Затронем наиболее интересные.

Boost

Это набор библиотек, которые расширяют функциональность C++. Предоставляет удобный кроссплатформенный интерфейс. Boost по-прежнему очень популярен, хотя многое и было интегрировано в новые стандарты C++. Так, в C++20 даже есть часовые пояса, для которых ранее активно использовался Boost.

OpenCV, ITK, VTK

Классическое решение для реализации компьютерного зрения. Даже с использованием нейронных сетей требуется много пред- и постобработки. OpenCV, ITK и VTK являются наиболее удобными библиотеками под эти задачи.

Tensorflow и PyTorch

Оба инструмента являются фреймворками для оценки нейронных сетей. Их также можно использовать для обучения нейронных сетей, но это редкое явление для C++. Гораздо проще обучать нейронную сеть на языке более высокого уровня (почти это Python). А вот когда у вас уже есть обученная нейронная сеть, вы можете написать оценку качества обученности модели на C++.

Tensorflow и PyTorch — мощные инструменты со своими преимуществами и недостатками. PyTorch становится популярным в научно-исследовательских кругах, тогда как Tensorflow — единственный выбор для работы со многими TPU (Tensor Processing Units, такими как Google Coral и Jetson Nano).

pybind/pybind11

если вам нужно привязать объекты C++ к Python, это самый популярный и простой способ. Доступный пример использования pybind11 на русском языке.

Protobuf

Набирает популярность. Protobuf — это механизм сериализации, основанный на двоичном коде, поэтому он быстрый и компактный. Был предложен Google как эффективная бинарная альтернатива текстовому формату XML.

MKL и OpenBLAS

Когда нужно реализовать математические алгоритмы с интенсивными вычислениями, которые должны работать с большим объемом данных, одна из этих библиотек просто необходима. MKL является стандартом для среды Windows, а OpenBLAS более популярна, когда требуется лицензия open source.

Посмотрите сравнение CUDA и OpenCL, а также держите подробный обзор графических библиотек C++.

IDE

Для всего, что связано с Windows, Visual Studio по-прежнему остаётся лучшей средой разработки, наиболее популярной и даже не сравнимой с любой другой IDE при программировании на C++ для Windows.

Для остального есть Visual Studio Code: он подходит для любого языка программирования, включая C++, потому что расширяемый, легковесный и удобный в использовании.

Самое плохое в Visual Studio и некоторых других IDE в том, что они тяжёлые и порой медленные. А Visual Studio Code работает быстро и делает программирование действительно увлекательным. Хоть, надо признать, в этой среде не хватает некоторых необходимых функций для разработки на C++ под Windows.

Выводы

Данный материал не несёт значительной обучающей нагрузки, а лишь демонстрирует путь развития C++ разработчика, параллельно объясняя некоторые азы. Используйте эту дорожную карту, чтобы в краткие сроки обучиться программированию на C++ с нуля и успешно перейти к практическому применению полученных знаний.