Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП Лекции PDF / ООП 08 Лек Перегрузка операторов.pdf
Скачиваний:
72
Добавлен:
15.02.2015
Размер:
403.59 Кб
Скачать

Лекция 8

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

1

Л Е К Ц И Я 8

ПЕРЕГРУЗКА ОПЕРАТОРОВ _____________________________________________________________ 1

Понятие перегрузки операторов___________________________________________________________ 1 Правила перегрузки операторов___________________________________________________________ 1 Перегрузка унарных операторов __________________________________________________________ 2 Перегрузка оператора присваивания_______________________________________________________ 4 Перегрузка бинарных операторов _________________________________________________________ 5 Перегрузка операторов X= _______________________________________________________________ 7

Перегрузка бинарных операторов, использующих объекты двух классов _________________________ 8

Перегрузка операторов инкремента и декремента____________________________________________ 9 Перегрузка оператора индексирования____________________________________________________ 11 Перегрузка оператора вызова функции____________________________________________________ 12 Функции преобразования типа ___________________________________________________________ 13

ПЕРЕГРУЗКА ОПЕРАТОРОВ

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

В C++ имеется возможность перегрузки большинства встроенных операторов. Операторы могут быть перегружены глобально или в пределах класса. Перегруженные операторы реализуются как функции с помощью ключевого слова operator. Имя перегруженной функции должно быть operator X, где X – перегруженный оператор. Ключевое слово operator, за которым следует символ оператора, называется именем операторной функции. Операторы, которые можно перегружать, приведены ниже.

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

 

 

 

 

 

 

 

 

 

+

-

!

*

++

--

~

&

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

+

-

/

*

%

<< >> &

^

|

=

->

||

!=

+=

-=

/=

*=

%=

<<=

>>=

&=

^=

|=

==

->*

&&

,

Другие перегружаемые операторы:

 

 

 

 

 

 

 

 

 

( )

[ ]

new

delete

 

 

 

 

 

 

 

 

 

 

Неперегружаемые операторы:

 

 

 

 

 

 

 

 

 

 

.

.*

::

? :

#

##

 

 

 

 

 

 

 

 

Необходимо отметить что, существуют две версии унарных операторов инкремента и декремента: префиксная и постфиксная.

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

Dot A (’A’) , B (’B’) , C (’C’) ;

// вызов конструктора

C = A + B ;

// неявный вызов перегруженного оператора сложения

C = A.operator + ( B ) ;

// явный вызов перегруженного оператора сложения

Правила перегрузки операторов

Операторная функция перегруженного оператора, за исключением new и delete, должна быть: либо нестатической функцией-членом класса; либо принимать аргумент типа класса; либо принимать аргумент перечислимого типа;

либо принимать аргумент, который является ссылкой на тип класса; либо принимать аргумент, который является ссылкой на перечислимый тип.

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

операторные функции = , ( ) , [ ] и -> должны быть нестатическими функциями-членами класса.

Операторная функция может быть объявлена как функция-член класса. В этом случае должны быть выполнены следующие правила:

Выжол Ю.А.

Объектно-ориентированное программирование