306______________________________Часть II. Программирование на C++
Первоначальная реализация потоковых классов. На заре 80-х годов объектно-ориентированный ввод-вывод был реализован в существующих функциях С. Это и неудивительно; старые добрые функции С лежат в основе многих классов. Скрывать с помощью классов причуды и сложности функций от постороннего взгляда оказалось удобно, но это замедляло и без того медленные функции ввода-вывода.
В чем сложность работы с функциями из файла stdio.h? Они требуют знания спецификаторов формата и непростого синтаксиса. Язык C++ предоставил возможность упростить этот интерфейс благодаря перегрузке операций и функций. Исходная посылка состояла в том, что интерфейс должен быть симметричен, несмотря на лежащие в его основе функции С. В главах 15 и 16 объясняется, как это было сделано.
Совет
Если после прочтения глав 15 и 16 вы не заметите никакой связи между перегрузкой функций, операций и тем, как можно использовать функции вроде printf для реализации потоков ввода-вывода, обратитесь к какому-нибудь другому учебнику по C++ или лучше бросьте программирование.
Замечание
Полное объяснение перегрузки операций содержится в главах 15 "Перегрузка функций" и 16 "Перегрузка операций". Ну а пока представьте себе такой алгоритм: есть несколько функций, каждая из которых работает с данными одного из базовых типов. В зависимости от типа данных вызывается соответствующая функция.
Теперь представьте, что компилятор сам может разобраться, для какого типа данных какую функцию вызывать. И далее вызывается соответствующая функция на основе printf, например, такая:
return_type function_name( char *str) f
printf( "%s", str) ;
}
Наконец представьте себе, что имя функции — это в действительности операция, и у вас будет законченное представление о том, на что похожи
оператор-функции.
'i
Впоследствии в процессе естественной эволюции классы iostream были переработаны уже без участия медленных функций printf и scant, при этом внешний интерфейс не претерпел совершенно никаких изменений.
Основные применения
Здесь мы подошли к изучению наиболее фундаментальных аспектов объектов cin (консольный ввод) и cout (консольный вывод). Для начала посмот-