746 __ ____Часть //. Программирование на C++
образом, в C++ продолжается традиция экстенсивного усовершенствования. Некоторые функции, так или иначе унаследованные от С, сделаны более надежными за счет дополнительных механизмов проверки, как, например, произошедшая от malloc операция new. Многие механизмы C++ изначально были реализованы с помощью С — например, потоки ввода-вывода были надстройкой над функциями заголовочного файла stdio.h — и позднее полностью переработаны уже без функций С.
Замечание
В, руководстве Annotated Reference Manual отмечается, что классы istream и ostream, предназначенные для вывода на консоль и ввода с клавиатуры, созданы как надстройка над функциями С printf и scanf. Страуструп же утверждает, что в конечном счете они были переработаны с нуля без применения функций С.
Операции потокового ввода-вывода *
Класс потоков ввода-вывода не является частью C++, но создан этот класс из конструкций C++ и на замену функциям ввода и вывода С. Основной мишенью замен в библиотеке С были printf и scanf. Функция printf служила для форматированного вывода на устройство вывода вроде монитора, а scanf, в свою очередь, для форматированного ввода.
В следующем разделе вы почувствуете некоторые аспекты философии C++ на фоне недостатков printf и scanf.
Функции printf и scanf
Для использования функций языка С printf и scanf следует включить заголовок stdio.h (standard input/output, стандартный ввод-вывод). Эти функции объявлены в заголовке примерно следующим образом:
int printf(const char*, ...);
int scanf(const char*, ...);
Примеры использования этих функций можно найти в главе 13 "Обзор потоков ввода-вывода". Аргумент const char * служит для передачи строки формата, которая определяет, как следует обращаться с остальными аргументами. Какими остальными аргументами, спросите вы? Остальные аргументы представлены многоточием (...), которое символизирует список аргументов переменной длины. Это означает, что вместо многоточия можно подставить произвольное число (от нуля и больше) аргументов различного типа.
Здесь кроется проблема. Поскольку количество и тип передаваемых аргументов не определены, например,