   •  Потоки ввода-вывода исполъзуют операторы » (направить в) и « (взять из) 
для записи и чтения данных. Выходной поток cout связан со стандартным 
системным выводом. Входной поток cin связан со стандартным вводом. Для вывода 
сообщений об ошибках на дисплей следует использовать выходной поток сегг. 
Наиболее безопасный способ чтения символьной строки в буфер — вызов 
функции-члена входного потока get(). Для чтения строки из системного 
стандартного ввода следует использовать cin.get() или cin.getlineO. 
Функции-члены принадлежат классам. Классы — один из главных вкладов C++ в 
программирование (см. главу 13). 
   •  Для установки ширины вывода в последующих операторах вывода в поток 
следует использовать такие функции-члены, как cout.width(). Для указания 
десятичного, шестнадцатеричного и восьмеричного формата вывода следует 
использовать модификаторы dec, hex и oct. Вы можете также использовать 
стандартные функции ( такие, как sprintf ) для подготовки строки к записи в 
выходной поток. 
   •  В C++ объявления могут появляться в любом месте любого блока операторов. 
Например, вы можете объявить переменную внутри скобок цикла for. Область 
видимости переменной ограничена операторным блоком, в котором она определена. 
Разумеется, вы должны объявлять переменные до их использования. Если имя 
локальной переменной совпадает с именем глобальной, локальное имя скрывает имя 
глобальной переменной. Вы можете использовать оператор разрешения области 
видимости ::, чтобы получить доступ к глобальной переменной. Если локальная 
переменная названа count, то выражение ::count ссылается на глобальную переменную. 
   •  Некоторые эксперты в программировании на C++ рекомендуют использовать 
идентификатор const вместо #define для объявления символьных констант. В этом 
случае компилятор сможет осуществить проверку соответствия типов данных 
константных объектов в выражениях. Кроме того, Turbo Debugger распознает 
имена, определенные с помощью const, а не #define. Глобальные константные 
значения, конечно, занимают пространство в сегменте данных, а их использование 
требует времени для обращения к памяти. На практике, несмотря на 
опубликованные советы, программисты на C++, напротив, используют #define так 
же успешно, как и программисты на С. 
   •  Встраиваемые функции вставляются непосредственно в скомпилированный код 
вместо вызова функции.. Для того чтобы избавиться от вызовов функций, 
расходующих время внутри циклов, которые должны выполняться наиболее быстро, 
следует использовать встраиваемые функции. Учтите, что ключевое слово inline, 
подобно register, является лишь рекомендацией компилятору, а не жестким 
указанием. Встраиваемые функции могут встраиваться, а могут и нет. 
(Встраиваемые функции никогда не компилируются встроенными, когда генерируется 
код для отладки.) 
    • Для выделения и удаления динамических переменных в куче следует 
использовать операторы new и delete. В программах на C++ операторы new и 
delete используются вместо обычных функций распределения памяти, подобных 
malloc(), calloc(), free() и др. Вы можете продолжать использовать эти функции в 
программах на C++. Память, выделенная new, конечно, должна быть освобождена 
delete. Память, выделенная с помощью функции malloc(), должна освобождаться 
функцией free(). 
    • Имена функций могут быть перегружены. В программе могут использоваться 
несколько функций с одинаковыми именами в том случае, если они отличаются хотя 
бы одним своим аргументом. Перегрузка функций помогает сокращать потребность в 
таких уникальных именах функций, как DrawCircle и DrawEllipse. Однако на вас 
ложится ответственность за рациональность использования перегрузки имен. 
Наверное, было бы неразумно назвать все функции одним и тем же именем! 
   •  Не указанные в вызове параметры снабжаются значениями с помощью аргументов 
функций по умолчанию. Объявлять значения по умолчанию следует после всех 
других параметров, приведенных в прототипе функции. 
   • Ссылка, объявленная с помощью &, ссылается на объект. В отличие от 
указателей, которые также могут ссылаться на объект, ссылка должна быть 
инициализирована при объявлении (за исключением отдельных случаев), и не может 
ссылаться в дальнейшем ни на какой другой объект. 
   • Ссылки обычно используются для объявления параметров функции, которые 
ссылаются на фактические аргументы, переданные в эту функцию. Таким образом, 
ссылки похожи на параметры-указатели, но они проще в использовании. Кроме 
того, иногда ссылки применяются в качестве возвращаемого значения функции. Это 
можно использовать при скрытии деталей реализации внутренней структуры данных, 
что позволяет проводить в ней изменения без соответствующих исправлений в коде. 

    Упражнения 

    12.1. Используя потоки ввода-вывода, напишите программу-фильтр, 
переводящую строчные буквы в заглавные. 
    12.2. Исправьте листинг 12.4 так, чтобы запрос повторялся до тех пор, пока 
не будет обнаружена ошибка во входном потоке. 


    Глава 12. Введение в C++     303 
