Глава 6. Базовые типы данных и операции__________________________747

const char* msg = "мир!";

printf("Здравствуй, %s", msg);

int birthday = 1974;

printf ("Вы родились в °od году\п", birthday);

то традиционные методы сопоставления переменных и аргументов не могут быть применены.

Замечание

Строка формата const char* может содержать литеры и параметры вроде %d (десятичный) и %s (строковый), помогающие функции разобраться в полученных аргументах.

Подробные сведения о параметрических типах аргументов ищите в главе 13 или в вашем справочном файле.

Точная информация о типах аргументов нужна компилятору для того, чтобы правильно извлекать переменные из стека (туда они помещаются при вызове функции). В случае списка аргументов переменной длины для этого имеется строка формата, задающая как количество, так и тип аргументов. Чтобы выяснить порядок, число и тип аргументов, лежащих в стеке, надо подсчитать и проанализировать параметрические аргументы — типа %d, %f или %s. И только потом аргументы можно извлекать из стека.

Эта возможность передачи списков аргументов не дается даром, процедура обработки строки формата делает printf и scanf достаточно медленными (изучение весьма замысловатых правил составления формата тоже не назовешь детской забавой). Очевидно, для ввода и вывода необходимо придумать что-то получше.

cin и couf

Класс iostream был создан еще при зарождении C++. Как ни удивительно, операция потокового вывода (ostream) « и операция потокового ввода (istream) » изначально были реализованы как надстройка над printf и scanf. Это может показаться странным, но справедливости ради следует сказать, что, как бы ни были неудобны эти функции, их работоспособность проверялась годами. Благодаря тому что особенности printf и scanf были загнаны внутрь классов, у пользователей отпала необходимость в понимании и применении только что упомянутых символов формата С.

Замечание

Для лучшего представления о том, как функции могут быть свернуты в классы и привязаны к операциям (как « и »), обратитесь к главам 14 "Базовые концепции классов", 15 "Перегрузка функций" и 16 "Перегрузка операций".