Бьерн Страуструп - Язык программирования С++. Главы 8-10 - Вывод встроенных типов

ОГЛАВЛЕНИЕ


10.2.1 Вывод встроенных типов

Для управления выводом встроенных типов определяется класс ostream с операцией << (вывести):
     class ostream : public virtual ios {
         // ...
     public:
        ostream& operator<<(const char*);    //строки
        ostream& operator<<(char);
        ostream& operator<<(short i)
          { return *this << int(i); }
        ostream& operator<<(int);
        ostream& operator<<(long);
        ostream& operator<<(double);
        ostream& operator<<(const void*);    // указатели
         // ...
  };
Естественно, в классе ostream должен быть набор функций operator<<() для работы с беззнаковыми типами.

Функция operator<< возвращает ссылку на класс ostream, из которого она вызывалась, чтобы к ней можно было применить еще раз operator<<. Так, если х типа int, то

       cerr << "x = " << x;
понимается как
       (cerr.operator<<("x = ")).operator<<(x);
В частности, это означает, что если несколько объектов выводятся с помощью одного оператора вывода, то они будут выдаваться в естественном порядке: слева - направо.

Функция ostream::operator<<(int) выводит целые значения, а функция ostream::operator<<(char) - символьные. Поэтому функция

      void val(char c)
      {
        cout << "int('"<< c <<"') = " << int(c) << '\n';
      }
печатает целые значения символов и с помощью программы
      main()
      {
        val('A');
        val('Z');
      }
будет напечатано
      int('A') = 65
      int('Z') = 90
Здесь предполагается кодировка символов ASCII, на вашей машине может быть иной результат. Обратите внимание, что символьная константа имеет тип char, поэтому cout<<'Z' напечатает букву Z, а вовсе не целое 90.

Функция ostream::operator<<(const void*) напечатает значение указателя в такой записи, которая более подходит для используемой системы адресации. Программа

      main()
      {
       int i = 0;
       int* p = new int(1);
       cout << "local " << &i
            << ", free store " << p << '\n';
      }
выдаст на машине, используемой автором,
      local 0x7fffead0, free store 0x500c
Для других систем адресации могут быть иные соглашения об изображении значений указателей.

Обсуждение базового класса ios отложим до 10.4.1.