Основы программирования на C++: Быстрый старт

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

1. Введение в C++: настройка окружения, переменные и базовые типы данных

Введение в C++: настройка окружения, переменные и базовые типы данных

Добро пожаловать в курс «Основы программирования на C++: Быстрый старт»! Вы сделали отличный выбор. C++ — это язык, на котором построена значительная часть современной цифровой инфраструктуры: от операционных систем (Windows, macOS) и веб-браузеров (Chrome, Firefox) до игровых движков (Unreal Engine) и высокочастотного трейдинга.

В этой первой статье мы пройдем путь от «чистого листа» до вашей первой работающей программы. Мы разберем, как подготовить компьютер к работе, что такое переменные и какие данные мы можем хранить в памяти.

Зачем учить C++ сегодня?

Многие новички спрашивают: «Не слишком ли сложен C++ для старта?». Да, у него высокий порог вхождения, но это окупается полным пониманием того, как работает компьютер. Изучив C++, вы с легкостью освоите Java, C#, Python или JavaScript.

Ключевые преимущества: * Производительность: C++ позволяет писать программы, которые работают молниеносно. * Контроль: Вы управляете памятью и ресурсами компьютера напрямую. * Универсальность: Язык используется практически везде.

Шаг 1. Настройка окружения

Чтобы компьютер понял код на C++, этот код нужно скомпилировать. Компьютер не понимает человеческий текст, он понимает только нули и единицы (машинный код). Программа, которая переводит ваш текст в машинный код, называется компилятор.

!Процесс превращения исходного кода в работающую программу.

Вариант для нетерпеливых: Онлайн-компиляторы

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

Рекомендуемые ресурсы: * OnlineGDB * Repl.it

Просто зайдите на сайт, выберите язык C++ и нажмите Run.

Вариант для профи: Локальная установка (IDE)

Для серьезной разработки вам понадобится IDE (Интегрированная среда разработки). Это «умный блокнот», который помогает писать код, искать ошибки и компилировать его.

  • Windows: Рекомендуем Visual Studio Community (бесплатная версия). При установке выберите галочку «Разработка классических приложений на C++».
  • macOS: Установите Xcode из App Store или используйте VS Code с расширением C++.
  • Linux: Обычно компилятор GCC уже установлен. Для удобства используйте VS Code или CLion.
  • Шаг 2. Ваша первая программа

    Традиционно изучение любого языка начинается с программы «Hello, World!». Давайте разберем её анатомию.

    Разберем каждую строку:

  • #include <iostream>: Это команда препроцессора. Она говорит: «Подключи библиотеку ввода-вывода». Без неё мы не сможем ничего вывести на экран.
  • int main() { ... }: Это главная функция. Любая программа на C++ начинает свое выполнение именно отсюда. Весь код внутри фигурных скобок {} будет выполнен.
  • std::cout << "Hello, World!";:
  • * std::cout — это поток вывода (обычно экран/консоль). * << — оператор вставки. Мы как бы «кидаем» текст в этот поток. * "Hello, World!" — строковый литерал, сам текст. * ;точка с запятой. В C++ она обязательна в конце каждой команды. Это как точка в конце предложения.
  • return 0;: Завершает работу функции main. Ноль традиционно означает «Успех». Если бы программа вернула -1 или 1, это означало бы ошибку.
  • Переменные: Коробки для данных

    Программы были бы бесполезны, если бы они просто выводили текст. Нам нужно хранить и обрабатывать информацию. Для этого существуют переменные.

    Представьте переменную как коробку, на которой написано имя, и в которую можно положить только определенный тип предметов.

    !Переменные как контейнеры для хранения данных разных типов.

    Чтобы создать (объявить) переменную в C++, используется следующий синтаксис:

    Пример:

    Здесь мы создали коробку типа int (целое число), назвали её apples и положили туда число 5.

    Правила именования переменных

    * Имя может содержать латинские буквы, цифры и знак подчеркивания _. * Имя не может начинаться с цифры. * C++ чувствителен к регистру: Apple и apple — это разные переменные. * Нельзя использовать зарезервированные слова (например, int, return, class).

    Базовые типы данных

    В C++ каждая переменная должна иметь строгий тип. Вы не можете положить слона в коробку для спичек. Рассмотрим основные типы:

    1. Целые числа (int)

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

    2. Вещественные числа (double и float)

    Используются для измерений, денег, физических величин. double имеет двойную точность по сравнению с float и используется чаще.

    3. Символы (char)

    Хранит один единственный символ. Обязательно заключается в одинарные кавычки.

    4. Логический тип (bool)

    Самый простой тип. Может принимать только два значения: true (истина) или false (ложь). Используется для условий и переключателей.

    5. Строки (std::string)

    Хотя это не совсем «базовый» (примитивный) тип, он необходим новичку сразу. Строки хранят текст. Для работы с ними нужно подключить библиотеку <string>.

    > Важно: Строки заключаются в двойные кавычки, а символы (char) — в одинарные.

    Ввод данных с клавиатуры

    Мы уже умеем выводить данные через std::cout. Чтобы получить данные от пользователя, используется std::cin (console input).

    Обратите внимание на направление стрелок: * cout << (из программы наружу) * cin >> (снаружи в программу)

    Пример интерактивной программы:

    Арифметические операции

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

    * + (сложение) * - (вычитание) (умножение) * / (деление) * % (остаток от деления — работает только с целыми числами)

    Пример деления:

    Заключение

    Сегодня вы сделали первый и самый важный шаг. Вы узнали:

  • Как работает компиляция.
  • Как выглядит структура программы (main).
  • Как создавать переменные (int, double, string).
  • Как общаться с пользователем через cin и cout.
  • В следующей статье мы разберем условные операторы — научим программу принимать решения в зависимости от введенных данных. Практикуйтесь, пишите код и не бойтесь ошибок — это лучший способ учиться!

    2. Управление потоком выполнения: условные конструкции, циклы и создание функций

    Управление потоком выполнения: условные конструкции, циклы и создание функций

    В предыдущей статье мы научились создавать «коробки» для данных — переменные. Но пока наши программы умеют только последовательно выполнять команды сверху вниз, как поезд, идущий по единственному пути. В реальной жизни (и в программировании) нам часто нужно принимать решения («Если пойдет дождь, я возьму зонт») или повторять действия («Пока не выучу урок, буду читать книгу»).

    В этой статье мы превратим наш линейный код в разветвленную и гибкую систему. Мы изучим три кита алгоритмического мышления:

  • Условные конструкции (ветвления).
  • Циклы (повторения).
  • Функции (подпрограммы).
  • Часть 1. Условные конструкции: Искусство выбора

    Представьте, что вы пишете программу для фейс-контроля в клубе. Вам нужно проверить возраст посетителя. Если ему есть 18 лет — пропустить, если нет — отказать. Для этого в C++ существует оператор if (если).

    Базовый синтаксис if-else

    Давайте реализуем фейс-контроль:

    !Схема работы условного оператора if-else.

    Операторы сравнения

    Чтобы задавать вопросы компьютеру, мы используем операторы сравнения. Результатом их работы всегда является true или false.

    * == — равно (не путайте с =, которое присваивает значение!) * != — не равно * > — больше * < — меньше * >= — больше или равно * <= — меньше или равно

    Сложные условия (Логические операторы)

    Иногда одного условия мало. Например, мы хотим пропустить человека, если ему есть 18 И он трезв. Или если у него есть VIP-карта ИЛИ билет.

    * && — Логическое И (AND). Истинно, только если оба условия верны. * || — Логическое ИЛИ (OR). Истинно, если хотя бы одно условие верно. * ! — Логическое НЕ (NOT). Инвертирует значение (превращает правду в ложь и наоборот).

    Пример:

    Часть 2. Циклы: Сила повторения

    Компьютеры превосходно справляются с рутинной работой. Если вам нужно вывести фразу «Я не буду спать на лекциях» 100 раз, писать 100 строк cout — плохая идея. Для этого существуют циклы.

    Цикл while (Пока)

    Этот цикл выполняется до тех пор, пока условие истинно. Это похоже на инструкцию: «Пока горит красный свет, стой».

    > Осторожно: Если вы забудете изменить переменную внутри цикла (например, не увеличите counter), условие всегда будет истинным, и программа зависнет в бесконечном цикле. Чтобы прервать такую программу, обычно нажимают Ctrl+C в консоли.

    Цикл for (Для)

    Это самый популярный цикл в C++. Он идеально подходит, когда мы точно знаем, сколько раз нужно повторить действие (например, от 1 до 10).

    Анатомия цикла for:

    Пример подсчета суммы чисел:

    Разберем, что происходит в скобках:

  • int i = 1 — создаем счетчик i и ставим его в 1. Выполняется один раз в начале.
  • i <= 10 — перед каждым шагом проверяем: мы еще не дошли до 10?
  • i++ — после каждого шага увеличиваем i на 1 (запись i++ аналогична i = i + 1).
  • Математическое отступление: Эффективность алгоритмов

    Мы только что посчитали сумму чисел от 1 до 10 с помощью цикла. Компьютер сделал 10 операций сложения. А если нужно сложить числа от 1 до 1 000 000? Цикл сделает миллион операций.

    Однако, в математике существует формула суммы арифметической прогрессии, которая позволяет найти результат мгновенно, без цикла:

    Где — искомая сумма чисел от 1 до , а — последнее число последовательности.

    Если мы применим эту формулу в коде:

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

    Часть 3. Функции: Разделяй и властвуй

    По мере роста программы код внутри main становится огромным и запутанным. Чтобы навести порядок, программисты разбивают код на небольшие логические блоки — функции.

    Функция — это мини-программа внутри вашей программы, которая делает что-то одно и (обычно) возвращает результат.

    Анатомия функции

    Давайте напишем функцию, которая складывает два числа:

    Теперь мы можем использовать эту функцию в main:

    Тип void

    Иногда функция должна просто что-то сделать (например, вывести текст на экран) и не должна возвращать число или строку. В таком случае в качестве типа возврата указывают void (пустота).

    !Функция принимает данные, обрабатывает их и возвращает результат.

    Практика: Игра «Угадай число»

    Давайте объединим все знания (переменные, ввод/вывод, циклы, условия и функции) в одной игре.

    Разберите этот код построчно. Здесь мы видим:

  • while внутри функции playGame для самого процесса угадывания.
  • if-else для подсказок игроку.
  • Цикл do-while в main, чтобы перезапускать игру по желанию пользователя.
  • Заключение

    Поздравляю! Теперь вы владеете инструментами управления потоком. Вы можете заставить программу принимать решения и выполнять сложную работу многократно.

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

    3. Работа с памятью: глубокое погружение в указатели, ссылки и массивы

    Работа с памятью: глубокое погружение в указатели, ссылки и массивы

    В предыдущих статьях мы научились создавать переменные, управлять потоком выполнения программы и писать функции. Мы представляли переменные как «коробки» с подписанными именами, в которых хранятся данные. Но где именно находятся эти коробки? Как компьютер находит их среди миллиардов других?

    Сегодня мы заглянем «под капот» C++ и разберем тему, которая делает этот язык таким мощным и быстрым: работа с памятью. Мы узнаем, что такое массивы, как работают адреса в памяти, и познакомимся с легендарными указателями, которыми пугают новичков (спойлер: они не такие уж и страшные).

    Часть 1. Массивы: Организованное хранение

    Представьте, что вам нужно сохранить оценки 30 студентов. Создавать 30 переменных (grade1, grade2, ... grade30) — это долго и неудобно. А если студентов будет 1000?

    Здесь на помощь приходят массивы. Массив — это набор переменных одного типа, расположенных в памяти строго друг за другом.

    !Визуализация массива как ряда пронумерованных ячеек памяти.

    Объявление и использование

    Синтаксис создания массива прост:

    Пример:

    Важные правила массивов:

  • Нумерация с нуля: Первый элемент имеет индекс 0, второй — 1, а последний — размер - 1. Если массив имеет размер 5, то индексы будут от 0 до 4.
  • Фиксированный размер: При создании обычного массива вы должны сразу сказать, сколько в нем элементов. Изменить этот размер позже нельзя.
  • Однородность: В массиве int могут лежать только целые числа. Смешивать типы нельзя.
  • Массивы и циклы — лучшие друзья

    Поскольку индексы — это просто числа, мы можем использовать цикл for для перебора всех элементов:

    Математика адресов в массиве

    Почему массивы работают так быстро? Потому что компьютер мгновенно вычисляет, где лежит нужный элемент, используя простую формулу. Память компьютера — это огромная лента байтов. Если мы знаем адрес начала массива, мы можем найти любой элемент.

    Формула вычисления адреса -го элемента:

    Где: * — адрес искомого элемента (ячейки памяти). * — базовый адрес (адрес самого первого элемента массива с индексом 0). * — индекс элемента, к которому мы хотим обратиться. * — размер типа данных в байтах (например, для int это обычно 4 байта).

    Благодаря этой формуле компьютеру не нужно перебирать весь массив, чтобы найти 1000-й элемент. Он просто считает адрес и сразу берет данные.

    Часть 2. Адреса и Указатели

    Теперь самое интересное. У каждой переменной в вашей программе есть две характеристики:

  • Значение (то, что лежит внутри коробки).
  • Адрес (номер полки на складе памяти, где стоит эта коробка).
  • Чтобы узнать адрес переменной, используется оператор & (амперсанд).

    На экране вы увидите что-то вроде 0x7ffee4b5, это шестнадцатеричное число — адрес ячейки памяти.

    Что такое указатель?

    Указатель (pointer) — это переменная, которая хранит не число и не текст, а адрес другой переменной.

    Если обычная переменная — это дом, то указатель — это записка с адресом этого дома.

    !Метафора указателя: знак, указывающий на местоположение объекта.

    Синтаксис указателей

    Для создания указателя используется звездочка *:

    Здесь int* читается как «указатель на int».

    Разыменование (Dereferencing)

    Имея указатель (адрес), мы можем получить доступ к самой переменной и изменить её. Это делается с помощью той же звездочки * перед именем указателя.

    Мы изменили переменную number, не трогая её напрямую, а используя «пульт дистанционного управления» — указатель.

    Часть 3. Ссылки: Удобная альтернатива

    Указатели мощные, но с ними легко ошибиться. В C++ есть более безопасный и удобный инструмент — ссылки (references).

    Ссылка — это псевдоним (второе имя) для уже существующей переменной. Это не отдельная переменная, это просто еще одна этикетка на той же самой коробке.

    Синтаксис использует амперсанд & при объявлении:

    Отличия ссылок от указателей

    | Характеристика | Указатель (*) | Ссылка (&) | | :--- | :--- | :--- | | Может быть пустым? | Да (может быть nullptr) | Нет, всегда должна на что-то ссылаться | | Инициализация | Можно инициализировать позже | Обязательна сразу при создании | | Смена цели | Можно перенаправить на другой адрес | Навсегда привязана к одной переменной | | Синтаксис | Нужно использовать * и & | Используется как обычная переменная |

    Зачем это нужно? Передача параметров в функции

    Вспомните функции из прошлой статьи. Когда мы передаем переменную в функцию, создается её копия. Если переменная огромная (например, картинка или длинный текст), копирование занимает время и память.

    Используя ссылки, мы даем функции доступ к оригиналу без копирования:

    А если мы хотим запретить функции менять наши данные, но все равно избежать копирования, используем const:

    Заключение

    Сегодня мы разобрали фундамент работы с памятью в C++:

  • Массивы позволяют хранить наборы данных рядом.
  • Указатели хранят адреса и дают полный контроль над памятью.
  • Ссылки предоставляют безопасный и удобный доступ к переменным и позволяют писать эффективные функции.
  • Понимание этих концепций отличает профессионала C++ от новичка. В следующей статье мы поднимемся на уровень выше и начнем изучать Объектно-Ориентированное Программирование (ООП) — парадигму, которая позволяет строить сложные системы из простых кирпичиков.

    4. Объектно-ориентированное программирование: классы, наследование, инкапсуляция и полиморфизм

    Объектно-ориентированное программирование: классы, наследование, инкапсуляция и полиморфизм

    Добро пожаловать на четвертый этап нашего курса «Основы программирования на C++: Быстрый старт»! До этого момента мы писали программы в процедурном стиле: данные (переменные) жили отдельно, а действия (функции) — отдельно. Это отлично работает для небольших задач, но когда программа разрастается до тысяч строк, такой подход превращается в хаос.

    Представьте, что вы строите автомобиль. Если бы вы программировали его процедурно, у вас была бы огромная куча деталей: 4 колеса, руль, двигатель, и сотни функций вроде крутить_колесо_1, крутить_колесо_2.

    Сегодня мы переходим к Объектно-Ориентированному Программированию (ООП). Это парадигма, которая позволяет моделировать реальный мир. Вместо разрозненных деталей мы будем создавать Объекты (например, «Колесо», «Двигатель», «Машина»), которые содержат внутри себя и свои характеристики, и свои умения.

    ООП держится на четырех китах:

  • Абстракция (Классы и Объекты)
  • Инкапсуляция
  • Наследование
  • Полиморфизм
  • Разберем их по порядку.

    1. Классы и Объекты: Чертеж и Здание

    Самая частая ошибка новичков — путать класс и объект. Давайте раз и навсегда разберемся с этим.

    Класс — это чертеж, шаблон или форма для выпечки. Он описывает, каким должен быть* объект, но сам по себе он не занимает места в оперативной памяти (почти). * Объект (или экземпляр) — это конкретный дом, построенный по чертежу, или печенье, сделанное формочкой. Мы можем создать тысячи объектов по одному классу.

    !Визуализация различия между классом (чертежом) и объектами (реальными экземплярами).

    Создание класса в C++

    В C++ классы создаются ключевым словом class. Внутри класса мы описываем: Поля (свойства/переменные) — что объект имеет*. Методы (функции) — что объект умеет делать*.

    Обратите внимание на точку .. Она используется для доступа к полям и методам объекта: объект.поле.

    2. Инкапсуляция: Скрываем лишнее

    Представьте, что вы ведете автомобиль. Вам нужно знать, как крутить руль и жать на педали. Но вам совершенно не нужно (и даже опасно) иметь прямой доступ к поршням в двигателе во время езды. Если бы у водителя была кнопка «Впрыснуть бензин в 3-й цилиндр», аварии случались бы постоянно.

    Инкапсуляция — это механизм, который объединяет данные и методы работы с ними в одном классе и скрывает детали реализации от пользователя.

    В C++ для этого используются модификаторы доступа:

  • public (публичный): Доступно всем. Это «руль и педали» вашего класса.
  • private (приватный): Доступно только самому классу. Это «внутренности двигателя». Из main сюда не попасть.
  • protected (защищенный): Похож на private, но доступен наследникам (об этом ниже).
  • Пример правильной инкапсуляции

    Давайте создадим класс банковского счета. Мы не хотим, чтобы кто-то мог напрямую изменить баланс (например, сделать его отрицательным или нарисовать миллион).

    Благодаря инкапсуляции мы защитили данные от некорректного использования.

    3. Наследование: Не повторяй себя

    Программисты ленивы (в хорошем смысле). Если у нас уже есть код, мы не хотим писать его заново.

    Представьте, что мы делаем игру. У нас есть Dog (Собака) и Cat (Кошка). У обоих есть имя, возраст, вес. Оба умеют бегать. Писать один и тот же код в двух классах — плохо.

    Наследование позволяет создать общий класс (Родитель) и на его основе создать специализированные классы (Наследники).

    !Схема наследования, показывающая передачу общих свойств от родительского класса к дочерним.

    Это принцип DRY (Don't Repeat Yourself — Не повторяйся).

    4. Полиморфизм: Один интерфейс, много форм

    Это самая сложная, но и самая мощная концепция. Слово «полиморфизм» греческого происхождения и означает «много форм».

    Суть в том, что мы можем обращаться с объектами разных классов одинаково, если у них есть общий родитель. Но вести себя они будут по-разному.

    Для реализации полиморфизма в C++ используются виртуальные функции (virtual).

    Представьте пульт от телевизора. Кнопка «Вкл» работает одинаково для телевизора Sony, Samsung и LG, но внутри каждого телевизора происходят разные процессы. Для вас интерфейс один — кнопка.

    Пример без полиморфизма (плохой)

    Пример с полиморфизмом (хороший)

    Мы объявляем функцию в базовом классе как virtual. Это говорит компилятору: «Посмотри, какой именно объект лежит в переменной, и вызови правильную версию функции».

    Обратите внимание: переменная myPet имеет тип Animal* (указатель на животное). Но когда мы вызываем voice(), программа понимает, что в данный момент там лежит Собака или Кошка, и вызывает соответствующий звук.

    Это позволяет нам создавать массивы из разных животных и обрабатывать их в одном цикле:

    Заключение

    Сегодня мы совершили квантовый скачок в понимании программирования. Мы перешли от написания инструкций к проектированию систем.

  • Классы задают структуру.
  • Объекты наполняют её жизнью.
  • Инкапсуляция защищает данные.
  • Наследование экономит код.
  • Полиморфизм дает гибкость.
  • В следующей статье мы познакомимся со Стандартной библиотекой шаблонов (STL). Вы узнаете, что массивы в C++ могут быть резиновыми (векторы), и что вам не нужно писать сортировку вручную. До встречи!

    5. Стандартная библиотека шаблонов (STL) и возможности современных стандартов C++

    Стандартная библиотека шаблонов (STL) и возможности современных стандартов C++

    Поздравляю! Вы добрались до финальной статьи нашего курса «Основы программирования на C++: Быстрый старт». Мы прошли долгий путь: от первой программы «Hello, World!» до создания собственных классов и иерархий наследования.

    В прошлых статьях вы могли заметить некоторые неудобства. Например, обычные массивы имеют фиксированный размер. Если вы создали массив на 10 элементов, а вам нужно записать 11-й — у вас проблема. Или, если вам нужно отсортировать числа, вам пришлось бы писать алгоритм сортировки вручную.

    Сегодня мы откроем для себя STL (Standard Template Library) — Стандартную библиотеку шаблонов. Это набор готовых инструментов, который превращает C++ из «конструктора с гайками и болтами» в мощную фабрику по производству программ. Также мы рассмотрим современные возможности языка (стандарты C++11, C++14 и новее), которые делают код чище и безопаснее.

    Что такое STL?

    STL — это часть стандартной библиотеки C++, содержащая готовые реализации контейнеров (структур данных), алгоритмов и итераторов. Вам больше не нужно изобретать велосипед.

    STL состоит из трех основных компонентов:

  • Контейнеры: Где хранить данные (векторы, списки, словари).
  • Алгоритмы: Как обрабатывать данные (сортировка, поиск, подсчет).
  • Итераторы: Связующее звено между контейнерами и алгоритмами.
  • Часть 1. Контейнеры: Умные хранилища

    std::vector — Резиновый массив

    Помните обычный массив int arr[5]? Его главный недостаток — фиксированный размер. Вектор (std::vector) — это динамический массив, который умеет растягиваться по мере необходимости.

    Чтобы использовать вектор, нужно подключить библиотеку <vector>.

    !Визуализация динамического изменения размера вектора при добавлении элементов.

    Пример работы с вектором:

    Главные преимущества вектора: * Не нужно заранее знать количество элементов. * Он сам следит за памятью (вам не нужно удалять его вручную). * Имеет множество встроенных методов (удаление, вставка, очистка).

    std::map — Словарь (Ассоциативный массив)

    В обычном массиве индексом может быть только целое число (0, 1, 2...). А что, если мы хотим искать данные по строке? Например, найти телефон по имени человека.

    Для этого существует std::map (карта или словарь). Он хранит пары «Ключ — Значение».

    Это невероятно мощный инструмент для создания баз данных в памяти, настроек программы или подсчета частоты слов.

    Часть 2. Итераторы: Универсальный указатель

    Чтобы перебирать элементы в разных контейнерах (векторах, списках, картах), в STL придумали итераторы. Это объекты, которые ведут себя как указатели. Они указывают на конкретный элемент в контейнере.

    У каждого контейнера есть два ключевых метода: * begin() — возвращает итератор на первый элемент. * end() — возвращает итератор на позицию после последнего элемента (не на последний, а именно за ним!).

    !Иллюстрация работы итераторов begin() и end().

    Часть 3. Алгоритмы: Готовые решения

    Зачем писать сортировку пузырьком, если инженеры Google и Microsoft уже написали для нас самую быструю сортировку? Библиотека <algorithm> содержит сотни полезных функций.

    Сортировка (std::sort)

    Поиск (std::find)

    Часть 4. Современный C++ (Modern C++)

    Язык C++ постоянно развивается. Стандарты C++11, C++14, C++17 и C++20 привнесли функции, которые делают код короче и понятнее. Рассмотрим самые важные из них.

    1. Автоматический вывод типов (auto)

    Раньше программисты обязаны были писать типы везде:

    Теперь компилятор умеет сам догадываться о типе переменной, исходя из того, что вы в неё кладете. Для этого используется ключевое слово auto.

    > Важно: Используйте auto только тогда, когда тип очевиден из контекста (как в примерах выше). Не злоупотребляйте им, иначе код станет нечитаемым.

    2. Цикл for-each (Range-based for loop)

    Вспомните, как мы перебирали массив раньше:

    В современном C++ это делается гораздо элегантнее. Мы говорим: «Для каждого элемента x в контейнере v»:

    А если мы хотим менять элементы внутри цикла, используем ссылку &:

    3. Лямбда-выражения (Анонимные функции)

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

    Синтаксис лямбды: [](параметры) { код }.

    Пример сортировки по убыванию с помощью лямбды:

    Заключение курса

    Мы завершаем наш курс «Основы программирования на C++: Быстрый старт». Давайте оглянемся назад.

    Вы узнали:

  • Как общаться с компьютером через переменные и типы данных.
  • Как управлять логикой программы с помощью условий и циклов.
  • Как работать с памятью напрямую через указатели.
  • Как строить архитектуру программы с помощью классов и ООП.
  • Как использовать мощь стандартной библиотеки STL.
  • C++ — это огромный океан. Мы научились плавать у берега, но впереди еще много интересного: многопоточность, умные указатели, сетевое программирование и разработка игр.

    Главный совет напоследок: Практикуйтесь. Программирование — это навык, который нарабатывается только пальцами на клавиатуре. Придумывайте себе задачи, решайте алгоритмические тесты, пишите свои игры.

    Удачи в мире кода!