0Pricing
C++ Academy · Урок

Операторы вставки и извлечения потоков

Научите свои типы взаимодействовать с std::cout через >.

«Операторы вставки и извлечения потоков» — бесплатный урок C++ Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Зачем перегружать << и >>

Научите свои типы взаимодействовать с std::cout и std::cin, перегрузив потоковые операторы.

Оператор вставки <<

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

struct Point { int x, y; };

std::ostream& operator<<(std::ostream& os, const Point& p) {
    return os << "(" << p.x << ", " << p.y << ")";
}

Point p{3, 4};
std::cout << p << "\n";   // (3, 4)

Зачем нужна свободная функция

Если бы Вы реализовали его как метод, левым операндом должен был бы быть Point — это невозможно, поскольку слева должен находиться std::ostream. Свободные функции поддерживают любой порядок операндов.

Оператор извлечения >>

Определите его для чтения из входных потоков. Проверяйте данные и устанавливайте failbit при ошибке.

std::istream& operator>>(std::istream& is, Point& p) {
    char open, comma, close;
    is >> open >> p.x >> comma >> p.y >> close;
    if (open != '(' || comma != ',' || close != ')')
        is.setstate(std::ios::failbit);
    return is;
}

Установка состояния ошибки потока

Если разбор данных завершился неудачно, вызовите is.setstate(std::ios::failbit). Вызывающий код может обнаружить ошибку с помощью !is или is.fail().

Объявления friend

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

class Point {
    int x_, y_;
public:
    friend std::ostream& operator<<(std::ostream& os, const Point& p);
};

Шаблонные типы потоков

Для максимальной переносимости параметризуйте шаблон типом символа. Это полезно для потоков широких символов.

template <typename CharT>
std::basic_ostream<CharT>& operator<<(
    std::basic_ostream<CharT>& os, const Point& p) {
    return os << "(" << p.x << ", " << p.y << ")";
}

Цепочки вызовов

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

std::cout << "Result: " << point << ", distance: " << dist;

Пользовательское форматирование

Для расширенного форматирования используйте std::ios::fmtflags или std::format из C++20. Потоки проще, но их сложнее локализовать.

Вывод в стиле JSON

В операторе можно комбинировать варианты форматирования. Для сложного вывода создавайте вспомогательные функции.

Чтение нескольких строк

Используйте std::getline для построчного чтения, а затем разбирайте данные с помощью строкового потока — это позволяет оставить operator>> простым.

Совет по производительности

Для очень производительного журналирования предпочтительнее использовать специализированные библиотеки (spdlog, fmt) — они значительно эффективнее потоков.

Быстрая проверка

Почему operator<< для пользовательского типа определяют как свободную функцию, а не как метод?

Итоги

Перегруженные operator<< и operator>> определяйте как свободные функции, принимающие поток по ссылке. Возвращайте поток для поддержки цепочки вызовов. Устанавливайте failbit при ошибках разбора данных. Используйте friend, когда нужен доступ к закрытым членам.

Часто задаваемые вопросы

Урок «Операторы вставки и извлечения потоков» бесплатный?

Да — полный текст урока «Операторы вставки и извлечения потоков» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Операторы вставки и извлечения потоков»?

Научите свои типы взаимодействовать с std::cout через >. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Операторы вставки и извлечения потоков»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Арифметические операторы и операторы сравнения
  2. Операторы вставки и извлечения потоков
  3. Операторы индексирования и вызова функции
  4. Оператор трёхстороннего сравнения C++20
← Назад к C++ Academy