Тип_возвращаемого_значения operator знак_операции

(список параметров)

{тело функции}

Определенная таким образом операция называется перегруженной, а сам механизм – перегрузкой, или расширением действия стандартных операций языка С++.

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

. - прямой выбор метода или поля структурированного объекта;

.* - обращение к методу или полю данных через указатель на него;

?: - условная операция (тернарная);

:: - операция указания области видимости;

# - препроцессорная операция;

## - препроцессорная операция;

sizeof - операция вычисления размера (в байтах).

 

Перегрузка операций осуществляется с помощью методов специального вида (функций-операций) и подчиняется следующим правилам:

· при перегрузке операций сохраняются количество аргументов, приоритеты операций и правила ассоциации (справа налево или слева направо), используемые в стандартных типах данных;

· для стандартных типов данных переопределять операции нельзя;

· нельзя вводить лексические обозначения операций, даже формируя их из допустимых символов (например, операцию возведения в степень ** из языка Фортрана нельзя ввести в С++);

· функции-операции не могут иметь аргументов по умолчанию;

· функции-операции наследуются (за исключением =);

· функции-операции не могут определяться как static.

 

Функцию-операцию можно определить тремя способами, она должна быть:

· либо методом класса;

· либо дружественной функцией класса;

· либо обычной функцией.

Когда функция-операция реализована как функция-элемент, крайний левый (или единственный) операнд должен быть объектом того класса (или ссылкой на объект того класса), элементом которого является функция. Если левый операнд должен быть объектом другого класса или встроенного типа, такая функция-операция не может быть реализована как функция-элемент.

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

Определив операцию-функцию, можно обратиться к ней не только неявно, используя знак операции, но и явно:

Operator знак операции(аргументы)

 

Унарную операцию класса можно перегружать как нестатическую функцию-элемент без аргументов, либо как функцию, не являющуюся элементом с одним аргументом; этот аргумент должен быть либо объектом класса, либо ссылкой, либо указателем на объект класса.

Бинарную операцию можно перегружать как нестатическую функцию-элемент с одним аргументом, либо как функцию, не являющуюся элементом, с двумя аргументами. Первым параметром дружественной функции, перегружающей бинарный оператор, является его левый операнд, а вторым – правый операнд.

 

Рассмотрим перегрузку некоторых специальных операторов.

Перегрузка операции присваивания

Операция присваивания определена в любом классе по умолчанию как поэлементное копирование. Эта операция вызывается каждый раз, когда одному существующему объекту присваивается значение другого. Если класс содержит поля, память под которые выделяется динамически, необходимо определить собственную операцию присваивания. Чтобы сохранить семантику присваивания, операция функция должна возвращать ссылку на объект, для которого она вызвана, и принимать в качестве параметра единственный аргумент - ссылку на присваиваемый объект. Операцию присваивания можно определять только как метод класса. Она не наследуется.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: