Перегрузка бинарных операций — КиберПедия 

Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Перегрузка бинарных операций

2017-06-05 260
Перегрузка бинарных операций 0.00 из 5.00 0 оценок
Заказать работу

Для перегрузки операций используется ключевое слово operator. Прототип перегруженной операции:

тип_возвращаемого значения operator символ оператора (операнды) { тело _ функции };

Перегружать операции можно с помощью:

· функции-члена;

· функции-друга;

· глобальной функции (как правило, менее эффективно).

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

·. – операция выбора члена класса

·:: – операция разрешения области видимости

·?: – условная операция (например, j = i>0? 1: 0;)

·.* – операция разыменования указателя на член класса

· # – директива препроцессора

· sizeof

· typeid

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

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

Тип выходного параметра является встроенным типом или типом, определенным пользователем (то есть классом).

Если при перегрузке операции методом класса результатом применения операции является изменение первого (или единственного) операнда, то рекомендуется объявлять выходной параметр в виде ссылки на текущий объект. Это необходимо для оптимизации использования результата операции в других операциях, совмещенных в одном операторе, например: z = x += y;

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

Перегрузка операции присваивания может быть произведена только методом класса и не может быть перегружена функцией-другом.

В отличие от операции присваивания операция ‘+=’ (и другие подобные операции) может быть перегружена как методом класса, так и функцией-другом.

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

X & operator = (const X &); или X & operator = (X&);

Операцию следует перегружать функцией членом того класса, который является типом первого операнда. Если первый операнд имеет встроенный или библиотечный тип, в описание которого невозможно вставить описание дружественной функции, то такую операцию можно перегружать только функцией-другом класса, к которому относится второй операнд [8-9].

Перегрузка операции вывода

В файле внешней стандартной библиотеки iostream стандартная операция языка ‘ << ’, осуществляющая побитовый сдвиг, перегружена в классе ostream как операция вывода. Операция ‘ << ’перегружена для вывода объектов стандартных типов: int, char, double, char* – и других встроенных типов. Формат использования данной операции:

cout << переменная_стандартного_типа;

Таким образом, первый операнд операции ‘ << ’должен иметь тип ostream. Если необходимо перегрузить данную операцию для структурированного вывода объекта астрактного пользовательского типа, то это можно сделать только функцией-другом разработанного класса. Она должна иметь два аргумента. Один типа ссылки на объекты класса ostream, а другой ссылка на объект класса, для которого нужно перегрузить эту операцию. Код возврата должен иметь тип ссылки на объект класса ostream. Код этой оператор-функции должен обеспечивать вывод требуемых полей класса как данных стандарного типа [8-9].

Перегрузка унарных операций

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

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

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

Операция индексирования является бинарной: ее операнды – объект с нумерованными элементами (массив, вектор и т. д.) и целое число – индекс элемента.


Поделиться с друзьями:

Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.007 с.