Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections_rus.doc
Скачиваний:
31
Добавлен:
06.02.2016
Размер:
1.41 Mб
Скачать

4.1.2. Общие принципы перегрузки операторов

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

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

Операции, которые могут быть перегружены

+

-

*

/

%

&

!

=

<

>

+=

-=

*=

/=

%=

<<

>>

!=

<=

>=

&&

||

++

--

,

->

==

( )

[ ]

new

delete

 

Внимание! Операции, которые не могут быть перегружены

.

::

?:

sizeof

 

Рассмотрим еще несколько важных особенностей механизма перегрузки операторов языка С++.

Перегрузка оператора для класса определяет смысл указанной операции при ее использовании в выражении, содержащем хотя бы один объект класса. Другими словами, нельзя изменить с помощью перегрузки операторов смысл работы операции с объектом встроенного типа. Например, невозможно для операнда m типа int изменить смысл выражения 2 + m . Перегрузка операций применима только для работы собъектами типов, определенных пользователем или со смесью объектов типов, определенных пользователем, и встроенных типов.

Старшинство (приоритет) операций не может быть изменено перегрузкой. Если Вы хотите изменить последовательность выполнения перегруженных операций в выражениях, используйте скобки.

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

Перегрузка операций присваивания и сложения, как obj2 = obj2 + obj1; не означает, что операция+= также перегружается с целью разрешить такие операторы, какobj2 += obj1; Этого можно достичь путем явной перегрузки операции+=для данного класса.Операторы можно перегружать только явно, неявной перегрузки не существует.

4.1.3. Бинарные и Унарные Операции

Бинарная операция может быть определена или как функция-член, получающая один параметр, или как функция-друг, получающая два па­раметра. Таким образом, для любой бинарной операции aa@bb может интерпретироваться или как aa.operator@(bb), или как opera­tor@(aa,bb). Если определены обе, то помочь, в выяснении какую из них использовать поможет механизм разрешения перегрузки [11].Унар­ная операция, префиксная или постфиксная, может быть определена или как функция член, не получающая параметров, или как функция друг, получающая один параметр. Таким образом, для любой унарной операции @ aa@ или @aa (постфиксная и префиксная) должны быть определены разныефункции перезагрузки. Подробно об этом мы поговорим позже.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]