Полезные ссылки
- learncpp.com - учебник по C++ (англ.)
- Справочник (cppreference.com) (англ.)
- Поддержка стандарта компиляторами (англ.)
- Грокаем C++ – телеграм-канал, ведущийся Владимиром и Денисом – сеньорами C++.
- Руководство по C++ от metanit.com – отличное руководство для новичков.
Введение (WIP)
Содержание:
О самом C++
C++ (произносится как "си плюс плюс") – один из самых распостранённых языков программирования высокого уровня в наше время. Он известен своей высокой производительностью, а также сложностью.
C++ является компилируемым языком программирования – весь код, написанный на нём, предварительно обрабатывается специальной программой – компилятором. Компилятор переводит наш "текст" на C++ в набор машинных кодов, которые уже понятны для компьютера. Это всё, что стоит пока что знать о нём. Подробнее его рассмотрим в других главах.
Рассмотрим ещё некоторые особенности языка.
Статическая типизация. Это значит, что типы всех переменных в вашем коде известны уже на этапе компиляции, и этот тип не может меняться во время выполнения программы. В противоположность статической типизации дана динамическая, которая есть в таких языках, как Python, JavaScript и Lua.
Ручное управление памятью. ...
Q: Почему C++ считается таким сложным?C++ предоставляет полный контроль над каждым аспектом программы и не делает почти никаких ограничений. Это вынуждает программиста внимательно следить за тем, что он пишет. В этом языке есть тысяча разных способов накосячить в коде и даже не заметить. Например, C++ не проверяет границы массивов; C++ позволяет обратиться в любой участок памяти, даже защищённые, из-за чего операционная система может аварийно завершить программу – это и есть всем до боли известный Segmentation fault.
Однако, если использовать только те части языка, которые вам хорошо знакомы, то большинства ошибок можно избежать.
Краткая история С++.
Язык C++ был создан как "улучшенный C", который включает гибкие и эффективные инструменты для построения новых типов. Он вносит множество вещей, сохраняя полную обратную совместимость с C (почти полную), но самое главное – классы. Класс – это определяемый пользователем тип, которые обеспечивают инкапусляцию данных, их инициализацию, неявное преобразование пользовательских типов и многое другое.
Первая версия C++, созданная в начале 1980-х годов, называлась "C с классами" ("C with classes"). Этот язык возник из-за необходимости решения больших задач моделирования. Такую задачу мог решить язык SIMULA-76, но он оказался недостаточно эффективен, а также в нём не доставало возможностей: перегрузки операций, ссылок, виртуальных функций и прочего. В публичный доступ C++ вышел только в 1983 году.
С 1998 года комитет ISO (вики) взял на себя обязательства по стандартизации языка, по которому создаются компиляторы. На данный момент есть 5 основных версий языка: C++11, C++14, C++17, C++20 и C++23. На данном сайте будет рассматриваться преимущественно самый последний вышедший стандарт языка.
Q: Что насчёт онлайн-IDE?Онлайн-IDE сложно назвать настоящими IDE, так как обычно их функционал сильно урезан. Но на первых порах их можно смело использовать.
Подготовка к разработке
Для разработки на C++ необходимо только две вещи: редактор файлов и компилятор. За редактор может сойти и обычный встроенный блокнот, но обычно так никто не делает. Принято использовать специализированные среды разработки, то есть IDE. Они предоставляют множество удобств для работы с языком: подсветка синтаксиса, автодополнение, поиск, рефакторинг и прочее.
Так как комитет ISO не занимается разработкой компилятора, а только документа, определяющего язык, существует множество реализаций компилятора. Рассмотрим некоторые из них:
- Microsoft Visual C++ (MSVC++) – одновременно и IDE, и компилятор для C++ от Microsoft. Нацелен только на Windows.
- G++ – компилятор C++ с открытым исходным кодом, распостраняемый внутри пакета компиляторов GCC. Для Windows он распостраняется в различных версиях, например, MinGW-w64; а в большинстве дистрибутивов Linux он уже предустановлен.
- LLVM/Clang – тоже компилятор с открытым исходным кодом, но с использованием LLVM (вики). Имеется в репозиториях большиства Linux-дистрибутивов.
Windows
MSVC и Visual Studio
...
G++
...
LLVM/Clang
...
Linux
G++
На большинстве дистрибутивов Linux пакет компиляторов GNU уже предустановлен, так что давайте проверим его версию:
learncpp:~$ g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
learncpp:~$
Как мы видим, установлена версия 11.4. На 6 мая 2024 года последней версией является GCC 14.1. Однако и 11-й версии уже достаточно, она поддерживает около 90% нововведений C++20.
Версия GCC | Версия стандарта |
---|---|
4.8 | C++11 |
5 | C++14 |
7 | C++17 |
8-12** | C++20* |
13-14** | C++23* |
Подробнее *Поддержка этих стандартов до сих пор неполная. **Различные фичи языка реализованы только в более поздных версиях.
Q: Что делать, если "команда не найдена"?Это значит, что у вас не установлен GCC. Вам необходимо выполнить следующую команду в терминале:
# Для Debian-дистрибутивов: Debian, Ubuntu, Mint и пр. sudo apt install gcc # Для RPM-дистрибутивов как CentOS. sudo yum install gcc # Для Arch-дистрибутивов sudo pacman -Ss gcc
LLVM/Clang
Clang – компилятор, довольно похожий на GCC. Clang ставит своей целью полностью заменить GCC и вполне с этим справляется. Он поддерживает большинство опций GCC.
Он редко бывает предустановлен, поэтому его придётся установить. Я не рекомендую использовать версию из стандартного репозитория, поэтому мы воспользуемся скриптом, который установить Clang автоматически. Однако этот способ может не сработать на дистрибутивах, не основанных на Debian. В этом случае воспользуйтесь командами ниже:
# Для Debian-дистрибутивов: Debian, Ubuntu, Mint и пр.
sudo apt install clang
# Для RPM-дистрибутивов как CentOS.
sudo yum install clang
# Для Arch-дистрибутивов
sudo pacman -Ss clang
Установка через скрипт llvm.sh:
# Скачиваем скрипт.
wget https://apt.llvm.org/llvm.sh
# Делаем скрипт исполняемым.
chmod +x llvm.sh
# Запускаем скрипт с правами суперпользователя и указываем, что
# хотим установить Clang 17-й версии.
sudo ./llvm.sh 17
Версия Clang | Версия стандарта |
---|---|
3.3 | C++11 |
3.4 | C++14 |
5 | C++17 |
6-19** | C++20* |
13-19** | C++23* |
Подробнее *Поддержка этих стандартов до сих пор неполная **Различные фичи языка реализованы только в более поздных версиях.
Среда разработки (IDE)
Среда разработки – вторая программа по важности после компилятора. Если вы, конечно, не мазохист, чтобы писать в блокноте.
Visual Studio
Бесплатная
Visual Studio – IDE от Microsoft для продуктов Microsoft, то есть для Windows. Имеет бесплатное Community издание.
Для установки Visual C++ нам необходимо установить пакет Microsoft C++ Build Tools по ссылке:
...
Visual Studio Code
...
CLion
Платная, 118 долларов США в год или 12 в месяц (около 12 000 и 1 250 рублей)
CLion – IDE от Jetbrains, доступная на трёх основных платформах: Windows, Linux и Mac.
Code::Blocks
...
Введение (WIP)
Содержание:
О самом C++
C++ (произносится как "си плюс плюс") – один из самых распостранённых языков программирования высокого уровня в наше время. Он известен своей высокой производительностью, а также сложностью.
C++ является компилируемым языком программирования – весь код, написанный на нём, предварительно обрабатывается специальной программой – компилятором. Компилятор переводит наш "текст" на C++ в набор машинных кодов, которые уже понятны для компьютера. Это всё, что стоит пока что знать о нём. Подробнее его рассмотрим в других главах.
Рассмотрим ещё некоторые особенности языка.
Статическая типизация. Это значит, что типы всех переменных в вашем коде известны уже на этапе компиляции, и этот тип не может меняться во время выполнения программы. В противоположность статической типизации дана динамическая, которая есть в таких языках, как Python, JavaScript и Lua.
Ручное управление памятью. ...
Q: Почему C++ считается таким сложным?C++ предоставляет полный контроль над каждым аспектом программы и не делает почти никаких ограничений. Это вынуждает программиста внимательно следить за тем, что он пишет. В этом языке есть тысяча разных способов накосячить в коде и даже не заметить. Например, C++ не проверяет границы массивов; C++ позволяет обратиться в любой участок памяти, даже защищённые, из-за чего операционная система может аварийно завершить программу – это и есть всем до боли известный Segmentation fault.
Однако, если использовать только те части языка, которые вам хорошо знакомы, то большинства ошибок можно избежать.
Краткая история С++.
Язык C++ был создан как "улучшенный C", который включает гибкие и эффективные инструменты для построения новых типов. Он вносит множество вещей, сохраняя полную обратную совместимость с C (почти полную), но самое главное – классы. Класс – это определяемый пользователем тип, которые обеспечивают инкапусляцию данных, их инициализацию, неявное преобразование пользовательских типов и многое другое.
Первая версия C++, созданная в начале 1980-х годов, называлась "C с классами" ("C with classes"). Этот язык возник из-за необходимости решения больших задач моделирования. Такую задачу мог решить язык SIMULA-76, но он оказался недостаточно эффективен, а также в нём не доставало возможностей: перегрузки операций, ссылок, виртуальных функций и прочего. В публичный доступ C++ вышел только в 1983 году.
С 1998 года комитет ISO (вики) взял на себя обязательства по стандартизации языка, по которому создаются компиляторы. На данный момент есть 5 основных версий языка: C++11, C++14, C++17, C++20 и C++23. На данном сайте будет рассматриваться преимущественно самый последний вышедший стандарт языка.
Q: Что насчёт онлайн-IDE?Онлайн-IDE сложно назвать настоящими IDE, так как обычно их функционал сильно урезан. Но на первых порах их можно смело использовать.
Подготовка к разработке
Для разработки на C++ необходимо только две вещи: редактор файлов и компилятор. За редактор может сойти и обычный встроенный блокнот, но обычно так никто не делает. Принято использовать специализированные среды разработки, то есть IDE. Они предоставляют множество удобств для работы с языком: подсветка синтаксиса, автодополнение, поиск, рефакторинг и прочее.
Так как комитет ISO не занимается разработкой компилятора, а только документа, определяющего язык, существует множество реализаций компилятора. Рассмотрим некоторые из них:
- Microsoft Visual C++ (MSVC++) – одновременно и IDE, и компилятор для C++ от Microsoft. Нацелен только на Windows.
- G++ – компилятор C++ с открытым исходным кодом, распостраняемый внутри пакета компиляторов GCC. Для Windows он распостраняется в различных версиях, например, MinGW-w64; а в большинстве дистрибутивов Linux он уже предустановлен.
- LLVM/Clang – тоже компилятор с открытым исходным кодом, но с использованием LLVM (вики). Имеется в репозиториях большиства Linux-дистрибутивов.
Windows
MSVC и Visual Studio
...
G++
...
LLVM/Clang
...
Linux
G++
На большинстве дистрибутивов Linux пакет компиляторов GNU уже предустановлен, так что давайте проверим его версию:
learncpp:~$ g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
learncpp:~$
Как мы видим, установлена версия 11.4. На 6 мая 2024 года последней версией является GCC 14.1. Однако и 11-й версии уже достаточно, она поддерживает около 90% нововведений C++20.
Версия GCC | Версия стандарта |
---|---|
4.8 | C++11 |
5 | C++14 |
7 | C++17 |
8-12** | C++20* |
13-14** | C++23* |
Подробнее *Поддержка этих стандартов до сих пор неполная. **Различные фичи языка реализованы только в более поздных версиях.
Q: Что делать, если "команда не найдена"?Это значит, что у вас не установлен GCC. Вам необходимо выполнить следующую команду в терминале:
# Для Debian-дистрибутивов: Debian, Ubuntu, Mint и пр. sudo apt install gcc # Для RPM-дистрибутивов как CentOS. sudo yum install gcc # Для Arch-дистрибутивов sudo pacman -Ss gcc
LLVM/Clang
Clang – компилятор, довольно похожий на GCC. Clang ставит своей целью полностью заменить GCC и вполне с этим справляется. Он поддерживает большинство опций GCC.
Он редко бывает предустановлен, поэтому его придётся установить. Я не рекомендую использовать версию из стандартного репозитория, поэтому мы воспользуемся скриптом, который установить Clang автоматически. Однако этот способ может не сработать на дистрибутивах, не основанных на Debian. В этом случае воспользуйтесь командами ниже:
# Для Debian-дистрибутивов: Debian, Ubuntu, Mint и пр.
sudo apt install clang
# Для RPM-дистрибутивов как CentOS.
sudo yum install clang
# Для Arch-дистрибутивов
sudo pacman -Ss clang
Установка через скрипт llvm.sh:
# Скачиваем скрипт.
wget https://apt.llvm.org/llvm.sh
# Делаем скрипт исполняемым.
chmod +x llvm.sh
# Запускаем скрипт с правами суперпользователя и указываем, что
# хотим установить Clang 17-й версии.
sudo ./llvm.sh 17
Версия Clang | Версия стандарта |
---|---|
3.3 | C++11 |
3.4 | C++14 |
5 | C++17 |
6-19** | C++20* |
13-19** | C++23* |
Подробнее *Поддержка этих стандартов до сих пор неполная **Различные фичи языка реализованы только в более поздных версиях.
Среда разработки (IDE)
Среда разработки – вторая программа по важности после компилятора. Если вы, конечно, не мазохист, чтобы писать в блокноте.
Visual Studio
Бесплатная
Visual Studio – IDE от Microsoft для продуктов Microsoft, то есть для Windows. Имеет бесплатное Community издание.
Для установки Visual C++ нам необходимо установить пакет Microsoft C++ Build Tools по ссылке:
...
Visual Studio Code
...
CLion
Платная, 118 долларов США в год или 12 в месяц (около 12 000 и 1 250 рублей)
CLion – IDE от Jetbrains, доступная на трёх основных платформах: Windows, Linux и Mac.
Code::Blocks
...
Первый Hello World
Давайте рассмотрим код программы ниже:
#include <iostream>
int main() {
std::cout << "Hello World!" << std::endl;
}
...
Сопрограммы (корутины)
Корутина - это функция, которая может быть приостановлена и продолжена позже.
...
Сопрограммы в C++
Генераторы и co_await
Генератор – функция, которая может прерваться, вернуть значение, а затем снова продолжиться. Для этого мы должны дополнить интерфейс нашего promise_type методом awaitable yield_value(expr)
, который будет вызываться с помощью co_yield.
Пример генератора на языке Python, который ищет делители натуральных чисел:
def generator(n: int):
yield 1 # Единица всегда делитель
if n == 1: return
# Ищем все делители
i = 0
while (i := i + 1) * i <= n:
if n % i == 0:
# Сохраняем делители
a, b = i, n // i
# Приостанавливаем выполнение функции и возвращаем делители
yield a
if a != b:
yield b
yield n # Само число - тоже делитель
x = generator(10)
print(next(x)) # 1
print(next(x)) # 2
print(next(x)) # 5
print(next(x)) # 10
...
О сайте (WIP)
...
Связь
Почта: admin@learncpp.ru