
- •Понятие перегрузки операторов
- •Правила перегрузки операторов
- •Перегрузка унарных операторов
- •Файл Dot.h
- •Файл Dot.cpp
- •Файл Main.cpp
- •Перегрузка оператора присваивания
- •Файл Dot.h
- •Файл Dot.cpp
- •Перегрузка бинарных операторов
- •Файл Dot.h
- •Файл Dot.cpp
- •Файл Main.cpp
- •Файл Dot.h
- •Файл Dot.cpp
- •Перегрузка операторов X=
- •Файл Vec.h
- •Файл Vec.h
- •Файл Main.cpp
- •Файл DotVec.h
- •Файл DotVec.h
- •Файл DotVec.h
- •Файл DotVec.cpp
- •Перегрузка операторов инкремента и декремента
- •Файл Vec.h
- •Файл Vec.cpp
- •Файл Main.cpp
- •Файл Vec.h
- •Файл Vec.cpp
- •Файл Main.cpp
- •Перегрузка оператора индексирования
- •Файл Dot.h
- •Файл Dot.cpp
- •Файл Main.cpp
- •Перегрузка оператора вызова функции
- •Файл DotVec.h
- •Файл DotVec.cpp
- •Файл Main.cpp
- •Функции преобразования типа
- •Файл Vec.h
- •Файл Vec.cpp
- •Файл Main.cpp
Лекция 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, должна быть: либо нестатической функцией-членом класса; либо принимать аргумент типа класса; либо принимать аргумент перечислимого типа;
либо принимать аргумент, который является ссылкой на тип класса; либо принимать аргумент, который является ссылкой на перечислимый тип.
Кроме того, при перегрузке операторной функции выполняются следующие правила: операторная функция не может изменять число аргументов перегружаемого оператора; операторная функция не может изменять приоритет перегружаемого оператора; операторная функция не может иметь параметров по умолчанию;
операторные функции = , ( ) , [ ] и -> должны быть нестатическими функциями-членами класса.
Операторная функция может быть объявлена как функция-член класса. В этом случае должны быть выполнены следующие правила:
Выжол Ю.А. |
Объектно-ориентированное программирование |