Выражение извлечения
Как и внесение, извлечение выполняется в С++ переопределяемыми функциями-операторами, обращения к которым подставляются компилятором в зависимости от типов данных, используемых в выражении. Вернемся к нашему примеру.
Выражение извлечения в данной программе - это выражение, которое использует cin, предопределенный объект оператора iostream.
cin >> i >> buff;
При анализе этой конструкции компилятор ведет себя так же, как и при анализе выражения внесения, подставляя вызовы функции в соответствии с типами используемых переменных.
А что будет в случае ошибочного выражения? Конечно, ошибочные данные - это всегда ошибочные данные, и ни один язык не сможет их исправить. Но средствами языка можно создать программу, устойчивую к разрушительному действию ошибочных данных. Пусть, к примеру, наша программа ожидает на вводе строку "12 строчечка".
Если на вход поступит "строчечка 12", то программа будет в большом затруднении при попытке интерпретировать "строчечка" как число. Однако библиотека iostream, в отличие от scanf(), производит контроль ошибок после ввода каждого значения. Кроме того, iostream может быть расширена введением операторов для новых типов.
Одна из наиболее распространенных ошибок при использовании scanf() - это задание вместо адресов аргументов их значений. Другая распространенная ошибка - путаница в использовании модификаторов форматов. При работе с iostream такого не бывает, так как проверка соответствия типов - неотъемлемая часть процесса ввода-вывода. Компилятор обеспечивает вызов функций-операторов, строго соответствующих используемым типам.