Вывод встроенных типов
Для управления выводом встроенных типов определяется класс 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.