Другое

Перегрузка оператора вывода в C: что это и зачем она нужна

Lorem ipsum dolor

Перегрузка или переопределение оператора вывода в С — это часть большой системы перегрузки всех операторов в С. Одни операторы можно перегрузить, другие нельзя.

Переопределение или перегрузка оператора в С — это способ организовать полиморфизм. То есть организовать видимость одного и того же оператора с одним и тем же именем, но с разными параметрами.

О подобных процессах правильно говорить «перегрузка оператора в С». Термин «переопределение оператора в С» употребляется более локально в странах постсоветского пространства, так как он образовался именно здесь. Получается, что «перегрузка оператора» может называться:

  • переопределением оператора;

  • повторным определением оператора;

  • перекрытием операции.

Переопределение или перегрузка оператора вывода в С

Операторы ввода «>>» и вывода «<<» в основном применяются для простых типов данных, например «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 ' ' ».

В общем, большинство операторов в С можно перегрузить. Однако есть категория не переопределяемых операторов, с которыми невозможно осуществить переопределение из-за потенциальных проблем с безопасностью. К таким операторам относятся:

  • «.» — выбирает член класса;

  • «.*» — разыменовывает указатель на член класса;

  • «**» — оператор возведения в степень.

Также при определении запрещено корректировать приоритеты операторов или создавать собственные операторы, что тоже влияет на переопределение некоторых операторов в каждой конкретной ситуации.

Заключение

Переопределение оператора в С процедура нечастая, но используется. Сегодня мы познакомились с тем, как происходит перегрузка оператора вывода в С. В следующих статьях мы обсудим перегрузку других операторов.

Схожие статьи

Как сравнивать строки в Python при помощи встроенных операторов
Другое

Как сравнивать строки в Python при помощи встроенных операторов

Важнейшие аспекты информационной безопасности: 3 основы
Другое

Важнейшие аспекты информационной безопасности: 3 основы

Какой язык программирования самый востребованный на рынке труда?
Другое

Какой язык программирования самый востребованный на рынке труда?

Преимущества системы CRM для бизнеса
Другое

Преимущества системы CRM для бизнеса