Основы программирования на C++

Курс познакомит вас с одним из самых мощных компилируемых языков программирования. Вы изучите синтаксис, базовые конструкции, работу с функциями и памятью, опираясь на современные стандарты языка, описанные на [education.yandex.ru](https://education.yandex.ru/handbook/cpp/article/introduction) и [metanit.com](https://metanit.com/cpp/tutorial).

1. Введение в C++: первая программа и структура кода

Введение в C++: первая программа и структура кода

Язык программирования C++ был создан в начале 1980-х годов датским программистом Бьярном Страуструпом. Изначально он задумывался как расширение популярного языка C и носил название «Си с классами». Главной целью было добавить возможности объектно-ориентированного программирования, не жертвуя при этом высокой производительностью и контролем над ресурсами компьютера.

Сегодня C++ остается одним из самых востребованных и мощных инструментов в IT-индустрии. На нем разрабатывают операционные системы, высоконагруженные серверные приложения, браузеры, системы управления базами данных и современные игровые движки.

Философия языка и компиляция

В основе C++ лежит принцип нулевых накладных расходов (zero-overhead principle). Это означает, что программист не платит производительностью за те возможности языка, которые он не использует в своем коде. Если вы применяете сложную абстракцию, она будет работать так же быстро, как если бы вы написали низкоуровневый код вручную.

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

| Характеристика | C++ | Python / JavaScript | |---|---|---| | Тип исполнения | Компилируемый (переводится в машинный код до запуска) | Интерпретируемый (выполняется построчно во время работы) | | Типизация | Статическая (типы данных проверяются на этапе сборки) | Динамическая (типы данных определяются в процессе работы) | | Управление памятью | Ручное (программист сам контролирует выделение памяти) | Автоматическое (работает встроенный сборщик мусора) | | Скорость выполнения | Очень высокая | Относительно низкая |

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

  • Препроцессинг: специальная программа (препроцессор) сканирует код и выполняет директивы, начинающиеся с символа #. Например, она копирует текст подключаемых библиотек прямо в ваш файл.
  • Компиляция: подготовленный текст переводится в язык ассемблера — низкоуровневое представление инструкций процессора.
  • Ассемблирование: код на ассемблере преобразуется в бинарный объектный файл, состоящий из нулей и единиц.
  • Компоновка (линковка): компоновщик связывает ваш объектный файл с другими файлами и внешними библиотеками, формируя итоговый исполняемый файл (например, .exe в Windows).
  • > "C++ делает сложным выстрел себе в ногу, но когда вы это делаете, он отрывает всю ногу целиком." > > Бьярн Страуструп, создатель языка C++

    Анатомия первой программы

    Традиционно изучение любого языка программирования начинается с программы, которая выводит на экран приветственное сообщение. Рассмотрим классический пример Hello, World! на языке C++.

    Несмотря на небольшой объем, этот код содержит все ключевые элементы, необходимые для работы полноценного приложения. Разберем каждую строку подробно:

    #include <iostream> — это директива препроцессора. Она дает команду подключить стандартную библиотеку ввода-вывода (Input/Output Stream*). Без этой строки программа не будет знать, как выводить текст на экран или считывать нажатия клавиш. int main() — объявление главной функции программы. Выполнение любого приложения на C++ всегда начинается именно с функции main. Слово int перед названием означает, что функция должна вернуть целое число (integer*) операционной системе по завершении своей работы. * Фигурные скобки {} обозначают границы тела функции. Все команды, находящиеся внутри них, будут выполнены последовательно. * std::cout — объект стандартного потока вывода. Он находится внутри стандартного пространства имен std. Оператор << направляет текст "Hello, World!\n" в этот поток, чтобы он отобразился на мониторе. * Символы \n внутри кавычек — это специальная управляющая последовательность, которая означает переход на новую строку. * return 0; — команда завершения функции. Возврат нуля операционной системе традиционно сигнализирует о том, что программа выполнилась успешно и без ошибок.

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

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

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

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

    | Тип данных | Описание | Пример значения | Объем памяти (обычно) | |---|---|---|---| | int | Целые числа | 42, -15, 0 | 4 байта | | double | Числа с плавающей точкой (дробные) | 3.14, -0.001 | 8 байт | | char | Одиночный символ | 'A', '7', '?' | 1 байт | | bool | Логическое значение | true, false | 1 байт |

    Кроме вывода данных с помощью std::cout, стандартная библиотека предоставляет объект std::cin для чтения данных с клавиатуры. Он работает в паре с оператором >>, который направляет введенные данные в указанную переменную.

    Практический пример: вычисления по формуле

    Рассмотрим применение базового ввода-вывода и переменных на примере физической задачи. Вспомним закон Ома для участка цепи:

    где — сила тока в амперах, — электрическое напряжение в вольтах, а — электрическое сопротивление в омах.

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

    В этом коде мы используем тип double, так как при делении целых чисел результат часто получается дробным. Сначала программа объявляет две переменные: voltage и resistance. Затем она последовательно выводит подсказки на экран и ожидает ввода чисел от пользователя.

    Представим, что пользователь запустил эту программу и ввел напряжение 220 вольт, а затем сопротивление 10 ом. Программа считает эти значения, создаст новую переменную current и запишет в нее результат деления 220 на 10. В результате на экране появится сообщение: "Сила тока равна: 22 А". Если же при следующем запуске ввести напряжение 12 вольт и сопротивление 5 ом, программа мгновенно вычислит новый результат, и на экране отобразится 2.4 ампера.

    Обратите внимание на чувствительность языка к регистру. Переменные voltage, Voltage и VOLTAGE будут восприниматься компилятором как три совершенно разные области памяти. Ключевые слова языка, такие как int, return или double, всегда пишутся исключительно строчными буквами.

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