Перегрузка или переопределение оператора вывода в С — это часть большой системы перегрузки всех операторов в С. Одни операторы можно перегрузить, другие нельзя.
Переопределение или перегрузка оператора в С — это способ организовать полиморфизм. То есть организовать видимость одного и того же оператора с одним и тем же именем, но с разными параметрами.
О подобных процессах правильно говорить «перегрузка оператора в С». Термин «переопределение оператора в С» употребляется более локально в странах постсоветского пространства, так как он образовался именно здесь. Получается, что «перегрузка оператора» может называться:
переопределением оператора;
повторным определением оператора;
перекрытием операции.
Переопределение или перегрузка оператора вывода в С
Операторы ввода «>>» и вывода «<<» в основном применяются для простых типов данных, например «int» и «double». Однако иногда их применяют для ввода/вывода множества переменных класса. В подобных случаях обязательно происходит переопределение или перегрузка оператора в С.
При работе с оператором вывода «<<» разработчики знают, что первичный аргумент этого оператора чаще всего является ссылкой на непостоянный элемент «ostream». Такой объект не может быть постоянным, потому что внесение записи в выполняемый поток влияет на его состояние. А сам аргумент всегда будет ссылкой.
Вторичный аргумент оператора также является ссылкой, однако уже на постоянный объект класса, который вводится в поток.
Чтобы оператор вывода совмещался с прочими операторами, необходимо осуществить его переопределение, при котором он вернет величину аргумента «ostream».
Переопределение оператора вывода в С подразумевает, что сам оператор не является аргументом в классе, а переопределяется как обыкновенная функция, не входящая в класс.
Как это выглядит в коде:
#include <iostream>
#include <string>
struct Worker
{
std::string firstname;
int age;
};
std::ostream& operator<< (std::ostream &os, const Worker &p)
{
return os<< w.name << " " << w.age;
}
int main()
{
Worker tihon;
tihon.firstname = "Тихон";
tihon.age = 27;
std::cout<< tihon << std::endl;
return 0;
}
В этом скрипте оператор вывода переопределяется для элементов структуры Worker. А фактически выведет имя и возраст сотрудника через «пробел»:
Тихон 27
Переопределение других операторов в С
В С может быть осуществлена перегрузка других операторов, например:
присваивания,
ввода,
сравнения,
и др.
Важно понимать, что переопределение оператора в С — это удобная возможность вызвать функцию, но увлекаться этим не стоит, потому что это чревато последствиями. Желательно применять перегрузку тогда, когда она приведет к упрощению написания кода, не затруднит его чтение и обслуживание. Ведь у программистов есть такое выражение: «Код читается и обслуживается чаще, чем пишется».
Переопределение в С касается 4-х типов операторов:
переопределение обычных операторов: «+», «-», «%», «=», «|», «<<», «>>» и др.;
переопределение операторов преобразования;
переопределение операторов воздействия на память: «new» и «delete»;
переопределение литералов «operator ' ' ».
В общем, большинство операторов в С можно перегрузить. Однако есть категория не переопределяемых операторов, с которыми невозможно осуществить переопределение из-за потенциальных проблем с безопасностью. К таким операторам относятся:
«.» — выбирает член класса;
«.*» — разыменовывает указатель на член класса;
«**» — оператор возведения в степень.
Также при определении запрещено корректировать приоритеты операторов или создавать собственные операторы, что тоже влияет на переопределение некоторых операторов в каждой конкретной ситуации.
Заключение
Переопределение оператора в С — процедура нечастая, но используется. Сегодня мы познакомились с тем, как происходит перегрузка оператора вывода в С. В следующих статьях мы обсудим перегрузку других операторов.
Другое