Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Перегрузка оператора вывода
Если мы хотим, чтобы наш тип класса поддерживал операции ввода/вывода, то необходимо перегрузить оба соответствующих оператора. В этом разделе мы рассмотрим, как перегружается оператор вывода. (Перегрузка оператора ввода – тема следующего раздела.) Например, для класса WordCount он выглядит так:
} Проектировщик должен решить, следует ли выводить завершающий символ новой строки. Лучше этого не делать: поскольку операторы вывода для встроенных типов такой символ не печатают, пользователь ожидает аналогичного поведения и от операторов в других классах. Определенный нами в классе WordCount оператор вывода можно использовать вместе с любыми другими операторами:
} Программа печатает на терминале строки:
wd: < 12> sadness
Оператор вывода – это бинарный оператор, который возвращает ссылку на объект класса ostream. В общем случае структура определения перегруженного оператора вывода выглядит так:
} Первый его аргумент – это ссылка на объект ostream, а второй – ссылка (обычно константная) на объект некоторого класса. Возвращается ссылка на ostream. Значением всегда является объект ostream, для которого оператор вызывался. Поскольку первым аргументом является ссылка, оператор вывода должен быть определен как обычная функция, а не член класса. (Объяснение см. в разделе 15.1.) Если оператору необходим доступ к неоткрытым членам, то следует объявить его другом класса. (О друзьях говорилось в разделе 15.2.) Пусть Location – это класс, в котором хранятся номера строки и колонки вхождения слова. Вот его определение:
} Изменим определение класса WordCount, включив в него вектор occurList объектов Location и объект word класса string:
}; В классах string и Location определен оператор вывода operator< < (). Так выглядит измененное определение оператора вывода в WordCount:
} А вот небольшая программа для тестирования нового определения класса WordCount; позиции вхождений для простоты “зашиты” в код:
} После компиляции и запуска программа выводит следующее:
Вхождения: < 10> rosebud < 11, 3> < 11, 8> < 14, 2> < 34, 6> < 49, 7> < 67, 5> < 81, 2> < 82, 3> < 91, 4> < 97, 8>
Полученный результат сохранен в файле output. Далее мы определим оператор ввода, с помощью которого прочитаем данные из этого файла. Упражнение 20.7 Дано определение класса Date:
}; Напишите перегруженный оператор вывода даты в формате: (a) // полное название месяца September 8th, 1997 (b) 9 / 8 / 97 (c) Какой формат лучше? Объясните. (d) Должен ли оператор вывода Date быть функцией-другом? Почему? Упражнение 20.8 Определите оператор вывода для следующего класса CheckoutRecord:
}; |
Последнее изменение этой страницы: 2019-04-09; Просмотров: 277; Нарушение авторского права страницы