Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Книга C++.doc
Скачиваний:
24
Добавлен:
10.11.2019
Размер:
2.48 Mб
Скачать

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

Давайте остановимся на основных принципах перегрузки операторов.

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

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

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

+

-

*

/

%

&

!

=

<

>

+=

-=

*=

/=

%=

<<

>>

!=

<=

>=

&&

||

++

--

,

->

==

( )

[ ]

new

delete

 

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

.

::

?:

sizeof

 

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

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

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

  • Например, в выражении

  • obj1 + obj2 * obj3

  • нельзя назначить оператору '+' более высокий приотритет, чем у '*',

  • поэтому используйте скобки, если хотите изменить порядок вычислений:

  • (obj1 + obj2) * obj3

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

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