Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
39
Добавлен:
16.04.2013
Размер:
62.98 Кб
Скачать

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

Ключевое слово 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. Операторы присваивания, вызова функции, индексиро­вания и оператор доступа к члену через указатель на объект -> можно перегружать только нестатическими функциями-членами.

12

Соседние файлы в папке Тельминов (мб)