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