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» работают с различными типами данных и функциями