Что такое std в C++
hard

Что такое std в C++

Аккуратно заглядываем в код на C++

Эта статья — небольшое и простое практическое знакомство с программированием на C++. Мы здесь отойдём от классического объяснения совсем издалека и поговорим сразу о вводе и выводе данных. Если вы немного знаете программирование (например, на Python или JavaScript), то сможете без проблем разобраться с тем, что тут происходит.

👉 C++ — сложный и интересный язык, который используют в своих продуктах Google, Amazon, YouTube, Adobe и Spotify. Ещё на нём написан один из самых популярных игровых движков на сегодня — Unreal Engine.

Общий принцип работы C++

Чтобы дальше было понятнее, кратко разберём основы этого языка.

C++ — компилируемый и статически типизированный язык. Главные моменты, которые нужно знать для начала:

  • Компиляция. Весь код C++ перед запуском тщательно проверяется компилятором и трансформируется в один запускаемый файл. Это отличает компилируемые языки от интерпретируемых, когда написанный человеком код уже без такой тщательной проверки трансформируется в байт-код и выполняется построчно.
  • Строгая типизация. В универсальных языках, таких как Python, машина сама понимает, какой тип данных мы используем и где — строку, целое число, булеву переменную. В C++ это обязательно указывать самим.
  • Работа с памятью. C++ ждёт от разработчика чётких указаний насчёт того, сколько выделять ресурсов и каким процессам. Если этого не сделать, программа может перестать работать или даже повредить работу других программ в памяти.

Всё это делает C++ довольно сложным, но мощным инструментом.

Пространства имён (неймспейсы)

Работу в C++ лучше всего начать с понимания принципов пространств имён, или неймспейсов (namespace). 

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

Любой элемент программы всегда будет принадлежать какому-то пространству имён. По умолчанию всё принадлежит глобальному неймспейсу. Но разработчик может объявить свой собственный и указать, какие имена принадлежат этому неймспейсу.

Вот пример. Мы создаём две переменные с одинаковым названием count. Одна из них находится в пространстве имён my_lib, а другая — в глобальном пространстве имён (то есть в основном коде программы):

namespace my_lib {
   // локальное пространство имён
   int count = 42;
}
// глобальное пространство имён
int count = 10;

Теперь для использования нам нужно явно указать, из какого пространства имён нужно взять переменную. Чтобы взять count из my_lib, нужно использовать префикс: написать имя неймспейса и поставить двойное двоеточие. После этого пишем наш идентификатор, имя переменной: my_lib::count. Если не указывать ничего, C++ возьмёт переменную из глобального пространства имён. 

Посмотрим сначала на код в целом, а детали и команды разберём ниже:

// подключаем модуль для организации ввода-вывода
#include <iostream>

namespace my_lib {
   // создаём переменную в пространстве имён my_lib
   int count = 42;
}

// создаём переменную в глобальном пространстве имён
int count = 10;

int main() {
   // выводим на экран переменную count = 10
   // из глобального пространства имён
   std::cout << count << std::endl;
   // выводим на экран переменную count = 42
   // из пространства имён my_lib
   std::cout << my_lib::count << std::endl;
}

После запуска на экране появятся две разные переменные:

10
4

Введение в стандартную библиотеку C++

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

#include

И вот тут нам пригождается знание про пространство имён из прошлого раздела. Всё дело в том, что вызвать функции и методы в С++ можно с помощью команды std, которая отвечает за работу с неймспейсом стандартных функций.

Проще говоря, std — это доступ в пространство имён, где хранится весь набор готовых технологий из стандартной библиотеки. Название std — просто сокращение от standard library. Чтобы достать что-то оттуда, нужно использовать префикс std:: или подключить доступ сразу ко всему содержимому: это делается строкой кода using namespace std;.

Вот некоторые базовые штуки, которые есть внутри стандартной библиотеки: 

  • Операции ввода-вывода.
  • Классы строк.
  • Классы контейнеров, которые могут содержать другие элементы.
  • Алгоритмы для запуска готовых последовательностей действий.
  • Инструменты создания многопоточной программы.

Зачем использовать std::

Стандартная библиотека и неймспейс для неё появились в 1998 году, и с тех пор набор входящих туда технологий постоянно обновляется. 

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

У этого подхода есть ещё один плюс — он позволяет избегать конфликта имён.

Осторожно: много функций

В C++ могут существовать несколько элементов с одними и теми же именами. При этом в стандартной библиотеке уже находится большое количество готовых технологий, которые можно применить. Если просто импортировать всю библиотеку командой using namespace std;, при работе с большой программой велика вероятность создать функцию или даже просто переменную с названием, которое уже есть в std. Это вызовет ошибку компиляции, потому что компилятор не поймёт, какой объект брать: написанный вами или тот, который уже есть в библиотеке. 

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

В новых версиях языка в std постоянно добавляются новые функции, но всё это совместимо со старыми версиями, поэтому обновления компилятора не ломают старый код.

Основные компоненты стандартной библиотеки

Теперь посмотрим, что есть в С++ из коробки, если подключить эту библиотеку.

Контейнеры — классы, которые управляют коллекциями элементов. В Python есть аналогично работающие технологии, например списки и словари. Два самых нужных контейнера в C++ — std::vector и std::string (одномерные векторы и строки соответственно).

Кроме этих двух типов, в стандартной библиотеке есть много других контейнеров: это различные вариации списков, очередей, стеков и массивов.

Алгоритмы — набор функций для работы с контейнерами. Без них пришлось бы вручную описывать много рутинных инструкций: сортировку данных, их поиск, модификацию, сравнение и другие более тонкие и сложные манипуляции, например удаление дубликатов внутри массивов. А так вызвал одну команду из библиотеки — и у тебя уже очищенный массив. Красота!

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

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

Работа с вводом и выводом

Для работы с вводом и выводом в C++ используются два стандартных метода: std::cin и std::out. Это стандартные потоки ввода и вывода в C++, через которые можно получать данные от пользователя и выводить на экран информацию.

Ввод данных — std::cin

Чтобы ввести какие-то данные в программу (например, получить от пользователя его дату рождения), используют std::cin. После этого C++ считывает данные, которые пользователь вводит с клавиатуры, до тех пор, пока пользователь не нажмёт энтер (или пробел / табуляцию).

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

Вывод данных — std::out

Противоположность предыдущего — вывод данных. Здесь логика работает точно так же, только мы перенаправляем поток вывода уже из переменной на экран (с помощью оператора <<) и используем std::cout.

Вот пример несложной программы, которая выводит инструкции для пользователя, запрашивает у него слово и выводит на экран:

// подключаем стандартную библиотеку для ввода-вывода
#include <iostream>

// создаём основную функцию
int main() {
   // создаём строку
   std::string word;
   // выводим на экран подсказку для пользователя
   std::cout << "Введите слово: ";
   // ожидается ввод до первого пробела, табуляции или переноса строки
   // сразу записываем введённую пользователем строку в переменную
   std::cin >> word;
   // выводим сначала текст, потом переменную, потом переводим курсор на новую строку
   std::cout << "Вы ввели: " << word << std::endl;
   // завершаем выполнение программы
   return 0;
}

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

Введите слово: Парадигмат
Вы ввели: Парадигмат

Использование пространств имён

Получается, что для начала работы в C++ нужно понимать принципы трёх пространств имён.

Глобальное пространство имён — это неймспейс, который доступен везде. Здесь мы можем определять переменные, функции, классы. Всё, что не объявлено в конкретном пространстве имен, автоматически попадает в глобальное. 

Пространство имён std — стандартная библиотека, которая содержит готовые полезные функции, классы и объекты. Чтобы использовать, например, класс string или объект cout, нужно указывать пространство имён std.

Вложенные пространства имён возникают, если одно пространство имён может быть определено внутри другого. Это полезно для структурирования кода, особенно если он становится большим. Вложенные пространства имён помогают разделить различные области функциональности и не получить конфликт имён.

Что дальше

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

Обложка:

Алексей Сухов

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Юлия Зубарева

Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Вам может быть интересно
hard