Шаг 466.
Библиотека STL. Ввод-вывод с использованием потоковых классов. Cтандартные операторы << и >>. Оператор вывода <<

    На этом шаге мы рассмотрим особенности использования этого оператора.

    В С и C++ операторы << и >> используются для сдвига битов целых чисел вправо и влево. Классы basic_istream и basic_ostream перегружают операторы >> и << для выполнения стандартных операций ввода-вывода.

Оператор вывода <<

    Класс basic_ostream (а следовательно, и классы ostream и wstream) интерпретирует << как оператор вывода. Он перегружает этот оператор для всех базовых типов, включая char*, void и bool.

    В соответствии с определением операторов потокового вывода второй аргумент передается в соответствующий поток данных. Иначе говоря, данные пересылаются в направлении "стрелки":

  int i = 7;
  std::cout << i;  // Вывод: 7

  float f = 4.5;
  std::cout << f;  // Вывод: 4.5

    Оператор << перегружается так, что второй аргумент может относиться к произвольному типу данных. Это позволяет интегрировать ваши типы данных с системой ввода-вывода. Компилятор следит за тем, чтобы для вывода второго аргумента была вызвана правильная функция. Конечно, эта функция должна преобразовать второй аргумент в последовательность символов, выводимых в поток данных.

    В стандартной библиотеке C++ этот механизм также применяется при выводе строк (смотри 407 шаг), битовых полей (357 шаг) и комплексных чисел (418 шаг):

  std::string s("hello");
  s += ", world";
  std::cout << s;       // Вывод: hello, world

  std::bitset<10> flags(7);
  std::cout << flags;     // Вывод: 0000000111

  std::complex<float> c(3.1,7.4);
  std::cout << с;       // Вывод: (3.1,7.4)

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

    Оператор << также может использоваться для вывода нескольких объектов в одной команде. По общепринятым правилам операторы вывода возвращают свой первый аргумент, то есть результатом выполнения оператора вывода является выходной поток данных. Это позволяет объединять вызовы операторов вывода в цепочки вида:

  std::cout << х << " times " << у << " is " << х * у << std::endl;

    Цепочечные вызовы оператора << обрабатываются слева направо. Так, в приведенном примере первой будет выполнена следующая команда:

  std::cont << x

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

  std::cout << " times "

    Далее последовательно выводятся объект у, строковый литерал " is " и результат операции х*у. Оператор умножения обладает более высоким приоритетом, чем оператор <<, поэтому выражение х*у не нужно заключать в скобки, однако существуют операторы с более низким приоритетом (например, все логические операторы). Если в данном примере х и у - вещественные числа со значениями 2.4 и 5.1, будет выведена следующая строка:

  2.4 times 5.1 is 12.24

    На следующем шаге мы рассмотрим оператор ввода.




Предыдущий шаг Содержание Следующий шаг