Как сделать перегрузку оператора в с

Обновлено: 05.07.2024

Например, выполните следующую функцию:

Вышеупомянутая функция реализует оператор сложения (+) для пользовательского класса Box. Он добавляет атрибуты двух объектов Box и возвращает результирующий объект Box.

Внедрение перегрузки оператора

Следующая программа показывает полную реализацию:

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Перегружаемые и неперегружаемые операторы

+, -. ~, ++, - Эти унарные операторы принимают один операнд и могут быть перегружены.
+, -, *, /,% Эти двоичные операторы принимают один операнд и могут быть перегружены.
==,! =, , = Операторы сравнения могут быть перегружены.
&&, || Условные логические операторы не могут быть перегружены напрямую.
+ =, - =, * =, / =,% = Операторы присваивания не могут быть перегружены.
=. ->, new, is, sizeof, typeof Эти операторы не могут быть перегружены.

В свете вышеприведенных обсуждений распространим предыдущий пример и перегрузим несколько операторов:

Когда приведенный выше код компилируется и выполняется, он производит следующий результат:

Перегрузка операторов в C++

Программирование и разработка

Перегрузка операторов в C++

В этой статье содержится руководство по перегрузке операторов в C ++. Перегрузка операторов — полезная и мощная функция языка программирования C ++. C ++ допускает перегрузку большинства встроенных операторов. В этом руководстве мы будем использовать несколько примеров, чтобы продемонстрировать механизм перегрузки оператора.

Что такое Оператор?

Оператор — это символ, который указывает компилятору выполнить определенную операцию. Например, в C ++ существуют различные типы операторов, такие как арифметические операторы, логические операторы, операторы отношения, операторы присваивания, побитовые операторы и другие.

Что такое перегрузка оператора?

Синтаксис для перегрузки оператора

Примеры

Теперь, когда вы понимаете общую концепцию перегрузки операторов, давайте рассмотрим несколько рабочих примеров программ, чтобы вы поняли эту идею более конкретно. Мы рассмотрим следующие примеры:

  • Пример 1: перегрузка унарного оператора (1)
  • Пример 2: перегрузка унарного оператора (2)
  • Пример 3: Перегрузка двоичного оператора
  • Пример 4: Перегрузка оператора отношения

Пример 1: перегрузка унарного оператора (1)

перегрузка унарного оператора (1)

Пример 2: перегрузка унарного оператора (2)

перегрузка унарного оператора (2)

Пример 3: Перегрузка двоичного оператора

Как вы уже знаете, тип переменной определяет набор значений, которые она может хранить, а также набор операций, которые можно выполнять над этой переменной. Например, над значением переменной типа int ваша программа может выполнять сложение, вычитание, умножение и деление. С другой стороны, использование оператора плюс для сложения двух строк лишено всякого смысла. Когда вы определяете в своей программе класс, то по существу вы определяете новый тип. А если так, C++ позволяет вам определить операции, соответствующие этому новому типу.

Перегрузка оператора состоит в изменении смысла оператора (например, оператора плюс (+), который обычно в C++ используется для сложения) при использовании его с определенным классом. В данном уроке вы определите класс string и перегрузите операторы плюс и минус. Для объектов типа string оператор плюс будет добавлять указанные символы к текущему содержимому строки. Подобным образом оператор минус будет удалять каждое вхождение указанного символа из строки. К концу данного урока вы изучите следующие основные концепции:

  • Вы перегружаете операторы для улучшения удобочитаемости ваших программ, но перегружать операторы следует только в том случае, если это упрощает понимание вашей программы.
  • Для перегрузки операторов программы используют ключевое слово C++ operator.
  • Переопределяя оператор, вы указываете функцию, которую C++ вызывает каждый раз, когда класс использует перегруженный оператор. Эта функция, в свою очередь, выполняет соответствующую операцию.
  • Если ваша программа перегружает оператор для определенного класса, то смысл этого оператора изменяется только для указанного класса, оставшаяся часть программы будет продолжать использовать этот оператор для выполнения его стандартных операций.
  • C++ позволяет перегружать большинство операторов, за исключением четырех, перечисленных в таблице 24, которые программы не могут перегружать.

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

ПЕРЕГРУЗКА ОПЕРАТОРОВ ПЛЮС И МИНУС

Когда вы перегружаете оператор для какого-либо класса, то смысл данного оператора не изменяется для переменных других типов. Например, если вы перегружаете оператор плюс для класса string, то смысл этого оператора не изменяется, если необходимо сложить два числа. Когда компилятор С++ встречает в программе оператор, то на основании типа переменной он определяет ту операцию, которая должна быть выполнена.

Ниже приведено определение класса, создающее класс string. Этот класс содержит один элемент данных, который представляет собой собственно символьную строку. Кроме того, этот класс содержит несколько различных методов и пока не определяет каких-либо операторов:

class string

public:
string(char *); // Конструктор
void str_append(char *);
void chr_minus(char);
void show_string(void);
private:
char data[256] ;
>;

Как видите, класс определяет функцию str_append, которая добавляет указанные символы к содержимому строки класса. Аналогичным образом функция chr_minus — удаляет каждое вхождение указанного символа из строки класса. Следующая программа STRCLASS.CPP использует классstring для создания двух объектов символьных строк и манипулирования ими.

ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ

Перегрузка операторов — это возможность назначать новый смысл операторам при использовании их с определенным классом. Используя перегрузку операторов, вы можете повысить удобочитаемость ваших программ и облегчить их понимание, выражая операции класса более понятным образом. Из урока 25 вы узнаете, как разделить данные между объектами с помощью элемента static и как использовать методы класса, когда никакие объекты класса не объявляются. До изучения урока 25 убедитесь, что вы освоили следующее:

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

Например, рассмотрим такой класс:

И это вполне себе работоспособный код. Однако можно сделать лучше и красивее — переопределить оператор сложения:

Так как перегружаемый оператор будет использоваться для всех объектов данного класса, то он имеет модификаторы доступа public static . При сложении возвращается объект класса Point . Теперь мы можем сделать наш код более элегантным и понятным:

Аналогичным образом можно переопределять и другие арифметические операторы, в том числе операторы сложения, вычитания, умножения, деления и так далее. Например, вот так может выглядеть оператор * для выполнения операция скалярного умножения точки на плоскости:

И теперь мы можем умножать точку на любое число (выполнять скалярное умножение):

  • Операторы == и !=
  • Операторы и >
  • Операторы и >=

Например, переопределим оператор >. Переопределенный оператор в классе Point может быть таким:

Использовать эти операторы можно следующим образом:

Консольный вывод будет следующим:

Координаты точки point2 равны нулю

Второй пункт наиболее наглядно демонстрирует перегрузка унарных операторов, например, ++. Например, мы можем определить для класса Point оператор инкремента:

Более корректная перегрузка оператора инкремента будет выглядеть так:

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

Полный список перегружаемых операторов можно найти в документации msdn

После модификаторов public static идет ключевое слово explicit (если преобразование явное, то есть нужна операция приведения типов) или implicit (если преобразование неявное). Затем идет ключевое слово operator и далее возвращаемый тип, в который надо преобразовать объект. В скобках в качестве параметра передается объект, который надо преобразовать.

Например, пусть у нас есть следующий класс Counter , который представляет секундомер и который хранит количество секунд в свойстве Seconds :

Первый оператор преобразует число — объект типа int к типу Counter . Его логика проста — создается новый объект Counter , у которого устанавливается свойство Seconds . Второй оператор преобразует объект Counter к типу int , то есть получает из Counter число.

Применение операторов преобразования типов в программе может быть следующим:

Поскольку операция преобразования из Counter в int определена с ключевым словом explicit , то есть как явное преобразование, то в этом случае необходимо применить операцию приведения типов:

В случае с операцией преобразования от int к Counter операция определена с ключевым словом implicit , то есть как неявная, поэтому в коде выше мы ничего не указывали перед переменной x . Какие операции преобразования делать явными, а какие неявные — решает разработчик по своему усмотрению.

Отметим, что оператор преобразования типов должен преобразовывать из типа или в тип, в котором этот оператор определен. То есть оператор преобразования, определенный в типе Counter , должен либо принимать в качестве параметра объект типа Counter , либо возвращать объект типа Counter . Рассмотрим также более сложные преобразования, к примеру, из одного составного типа в другой составной тип. Допустим, у нас есть еще класс Timer :

Класс Timer представляет условный таймер, который хранит часы, минуты и секунды. Класс Counter представляет секундомер, который хранит только количество секунд. Исходя из этого мы можем определить логику преобразования из одного типа к другому, то есть получение из секунд в объекте Counter часов, минут и секунд в объекте Timer .

Применение операций преобразования:

Читайте также: