376______________________________Часть //. Программирование на C++

Заглянув в файл \Bc5\Include\iostream.h, вы найдете в нем следующее объявление endl:

ostream _FAR & _RTLENTRY _EXPFUNC endl^ostream _FAR &) ;

Замечание

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

Заглянув в iostream.h, вы встретите ссылку на файл _defs.h, с помощью которого можно расшифровать, что скрывается за словами _FAR, _RTLENTRY и _EXPFUNC. Эти определения препроцессора нужны для корректной компиляции функций для разных целевых моделей, будь то DLL, 16- или 32-разрядное приложение.

Отсеяв лишнее (разумеется, все это жизненно необходимо для обеспечения всевозможных совместимостей), мы остаемся с таким объявлением:

ostreams endl( ostreams);

Из него следует, что эта функция получает ссылку на ostream и возвращает тоже ссылку на ostream, благодаря чему она может быть вставлена звеном в цепочку потока вывода, не нарушая ее, как например:

cout « "Line I" « endl « "Line 2" « endl;

Чтобы понять это, снова следует вспомнить, что операторы — это разновидность функций. В действительности везде, где замешан класс ostream, не обходится без функций operator« (т. е. оператор-функций.«) возвращающих значения ostreams.

Функция endl неявно вызывается функцией operator«, возвращающей ссылку на ostream. Что делает эта функция? Она помещает в поток символ новой строки ('\п') и вызывает функцию-член flush().

Замечание

Понять, как отыскивать и использовать манипуляторы потоков, вам помогут следующие главы:

• Глава 8 "Раскрытие выражений" научит вас находить их в тексте программ '

• Глава 15 "Перегрузка функций" объясняет, каким образом в одном модуле могут сосуществовать несколько функций с одинаковыми именами

• Глава 16 "Перегрузка операций" описывает, как операции вроде operator» работают с различными типами данных и функциями