Перегрузка операторов
Ключевое слово operator используется для того, чтобы определить функцию-член, осуществляющую преобразование типа. Оно также используется для перегрузки встроенных операторов C++. Также как имени функции, такому как print, можно придать множество различных смыслов, зависящих от аргументов, так и оператору, например, +, можно приписать дополнительные значения. Перегруженные операторы можно использовать для привычной записи выражений как для встроенных типов, так и для АТД. Это очень удобный способ записи, во многих случаях он делает программы короче и читабельнее.
Унарные и бинарные операторы могут быть перегружены как нестатические функции-члены. Они неявно действуют на объект класса. Большинство унарных операторов можно перегружать как обычные функции, принимающие единственный аргумент класса или ссылку на тип класса. Большинство бинарных операторов можно перегружать как обычные функции, принимающие один или оба аргумента класса или ссылку на тип класса. Операторы =, (), [ ] и -> должны быть перегружены нестатическими функциями-членами.
class foo {
public:
foo operator-() ;
foo operator-(int);
foo operator-(foo) ;
};
foo operator-(int, foo);
foo operator-(int,foo*);
//унарный минус: - foo
//бинарный минус: foo - int
//бинарный минус: foo-oo
//бинарный минус: int - foo
//неверно!
//должно быть foo или foo&
Функция mру () из предыдущего раздела могла бы быть записана так:
vect operator*(const vect& v, const matrix& m)
. . . . .
Если бы это было сделано, и при этом r и s – это, а t - matrix, то выглядящее более естественно выражение
r = s * t;
вызвало бы функцию умножения. Все это заменяет форму записи в виде функции
r = mру(s, t) ;
Хотя операторы могут приобретать новые значения, их приоритет и порядок выполнения остаются прежними. Например, приоритет оператора умножения остается более высоким, чем приоритет оператора сложения. Таблица приоритетов операторов C++ включена в приложение В, «Приоритет и порядок выполнения операторов». Почти все операторы могут быть перегружены. Исключения составляют операторы выбора члена «.» и <. *>, тернарный условный оператор «? :», оператор sizeof и оператор разрешения области видимости <<:: >> (см. раздел С. 12.5, «Перегрузка операторов», на стр. 388).
Доступные для перегрузки операторы включают все арифметические и логические операторы, операторы сравнения, равенства, присваивания и битовые операторы. Более того, операторы автоинкремента и автодекремента (++ и --) могут иметь различные префиксные и постфиксные значения (см. упражнение 18, на стр. 224). Операторы индексации массива [ ] и вызова функции () также можно перегружать.
Это возможно и для операторов доступа к члену через указатель на объект ->, и обращения к члену через указатель на член ->* (см. упражнение 19 на стр. 224). Можно перегружать new и delete. Операторы присваивания, вызова функции, индексирования и оператор доступа к члену через указатель на объект -> можно перегружать только нестатическими функциями-членами.