Глава 13. Обзор потоков ввода-вывода___________________________327

Если операция потока вывода для типа DATE возвратит void или что-либо еще, отличное от ostreams, цепочка будет разорвана и этот фрагмент не будет компилироваться.

Два аргумента потоковых операций. Потоковые операции двухместные, т. е. у них должно быть два операнда (объекта). Если бы операторы были функциями-членами, то один объект был бы вызывающим, а второй передавался бы как аргумент.

Замечание

Когда оператор-функция является функцией-членом, один объект всегда является вызывающим. Если это двухместная операция, то второй объект передается ей в качестве аргумента. Число операций никогда не меняется, меняются их позиции.

Если количество операндов неверно, компилятор выдаст вам сообщение об ошибке. Если операция одноместная, то у членов не должно быть аргументов в скобках, а у глобальных функций аргумент один и располагается в скобках. Та же самая система соблюдается для двухместных операций: у функций-членов один операнд является вызывающим объектом, а второй передается в скобках; у глобальных функций в скобках помещаются оба операнда.

Поскольку мы установили, что операции для потоков ввода и вывода должны быть глобальными функциями, то и у тех, и у других аргументы должны располагаться между левой и правой скобками. Первый аргумент всегда имеет тип потока, а второй должен быть ссылкой на тип класса.

Аргументы ПОТОКОВЫХ операций. По приоритету аргументы потоковых операций распределяются следующим образом: старшей является "ссылка на поток", за ней следует "ссылка на объект". Порядок диктуется теми же семантическими правилами, о которых уже говорилось: слева (первым) идет объект потока, а справа (вторым) — операнд.

В главе 17 "Конструкторы: копирование и присваивание" объясняется, как избежать дополнительных вызовов конструктора копий и соответствующего деструктора, передавая по ссылке адреса аргументов вместо манипулирования реальными объектами.

Примеры создания потоковых операций

Сейчас мы рассмотрим пример, иллюстрирующий определение потоковых операций — как ввода, так и вывода — для гипотетического класса DATE. Одна операция выводит дату на консоль в нужном формате, а вторая считывает дату с клавиатуры, создавая объект типа DATE (см. листинг 13.8). Проверка корректности вводимых дат оставлена вам для самостоятельных упражнений.