Перегрузка операторов вывода — это повторное определение операторов вывода.
Введение
Перегрузка операторов, по сути, является наиболее практичным методом обращения к функциям, но нельзя ею злоупотреблять. Применять её необходимо для упрощения написания кода, но при условии, что не будет трудностей в чтении. Следует так же помнить о невозможности перегружать операторы вместе с включёнными типами. Выполнять перегрузку можно лишь пользовательских классов.
Синтаксические формы перегрузки операторов схожи с представлением функции по имени operator@. Здесь @ является определителем оператора. Ниже приведён пример, поясняющий сказанное:
Рисунок 1. Пример. Автор24 — интернет-биржа студенческих работ
В этом примере оператор является членом класса, а аргумент формирует значение, которое находится справа от оператора. Известны два главных метода перегрузки операторов:
- Функции глобального масштаба.
- Дружественные функции для класса или функции, представляющие сам класс.
Как правило, операторы (не считая условные) выполняют возврат объекта или ссылки на тип, относящихся к нему аргументов.
Перегрузка унарных операторов
Приведём образцы выполнения перегрузки унарных операторов для указанного ранее класса Integer. Они будут определяться как дружественные функции вместе с операторами увеличения и уменьшения:
Рисунок 2. Образцы перезагрузки. Автор24 — интернет-биржа студенческих работ
Рисунок 3. Образцы перезагрузки. Автор24 — интернет-биржа студенческих работ
Рисунок 4. Образцы перезагрузки. Автор24 — интернет-биржа студенческих работ
То есть компилятор способен отличать префиксные и постфиксные варианты уменьшения (декремента) и увеличения (инкремента).
Перегрузка оператора вывода
Для обеспечения поддержки типом класса операций ввода и вывода, следует выполнить перегрузку этих операторов. Приведём конкретный пример перегрузки оператора вывода для класса WordĆount:
Рисунок 5. Пример. Автор24 — интернет-биржа студенческих работ
Выводить или нет последний символ очередной строки, решает сам программист. Но рекомендуется это не осуществлять, так как операторы вывода при встроенном типе не выполняют печать этого символа, пользователь ждёт такого же эффекта и от операторов в других классах. Оператор вывода, который был определён в классе WordCount, возможно применять совместно со всякими иными операторами:
Рисунок 6. Пример. Автор24 — интернет-биржа студенческих работ
Программа выполняет вывод на экран:
wd:
sadnéss
Оператор вывода является бинарным оператором, возвращающим ссылку на объект класса ostréam. Обобщённая структура определения оператора вывода, который возможно перегружать, может быть представлена в следующем виде:
Рисунок 7. Пример. Автор24 — интернет-биржа студенческих работ
Первым аргументом будет ссылка на òstream, а вторым аргументом выступает ссылка (как правило, постоянная) на объект некоего класса. Выполняется возврат ссылки на òstream. Значением выступает объект òstream, так как именно для него осуществлялся вызов оператора. Так как ссылка это есть первый аргумент, то оператор вывода необходимо определить в виде обычной функции, а не членом класса. Если же оператору требуется доступ к закрытым членам, то нужно выполнить его объявление в другом классе. Предположим, Lòcation является классом, где сохраняются номер строки и колонки слова входа. Определить можно следующим способом:
Рисунок 8. Пример. Автор24 — интернет-биржа студенческих работ
Выполним изменение определения класса WordCòunt, путём включения в его состав вектора òccurList объектов Lòcation и объект wòrd класса strìng:
Рисунок 9. Пример. Автор24 — интернет-биржа студенческих работ
В strìng и Locatìon выполнено определение оператора вывода орèrator().