Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
369164_46F07_otvety_na_bilety_po_oop_si.doc
Скачиваний:
44
Добавлен:
24.12.2018
Размер:
613.38 Кб
Скачать

13. Перегрузка операций

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

+ - * / % ^ & | ~ !

= < > += -= *= /= %= ^= &=

|= << >> >>= <<= == != <= >= &&

|| ++ -- [] () new delete

Перегрузка операций

С++ позволяет переопределить действие большинства операций так, чтобы при использовании с объектами конкретного класса они выполняли заданные функции. Эта дает возможность использовать собственные типы данных точно так же, как стандартные. Обозначения собственных операций вводить нельзя. Перегрузка операций осуществляется с помощью функций специального вида (функций-операций) и подчиняется следующим правилам:

  • сохраняются количество аргументов, приоритеты операций и правила ассоциации (справа налево или слева направо) по сравнению с использованием в стандартных типах данных;

  • нельзя переопределить операцию по отношению к стандартным типам данных;

  • функция-операция не может иметь аргументов по умолчанию;

  • функции-операции наследуются (за исключением =);

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

Функция-операция содержит ключевое слово operator, за которым следует знак переопределяемой операции:

тип operator операция ( список параметров) { тело функции }

Перегрузка унарных операций

Унарная функция-операция, определяемая внутри класса, должна быть представлена с помощью нестатического метода без параметров, при этом операндом является вызвавший ее объект, например:

class monster

{... monster & operator ++() {++health; return *this;}}

monster Vasia;

cout << (++Vasia).get_health();

Если функция определяется вне класса, она должна иметь один параметр типа класса:

class monster

{... friend monster & operator ++( monster &M);};

monster& operator ++(monster &M) {++M.health; return M;}

Если не описывать функцию внутри класса как дружественную, нужно учитывать доступность изменяемых полей (в данном случае поле health недоступно извне, так как описано со спецификатором private, поэтому для его изменения требуется использование соответствующего метода, не описанного в приведенном примере).

Операции постфиксного инкремента и декремента должны иметь первый параметр типа int. Он используется только для того, чтобы отличить их от префиксной формы:

class monster

{... monster operator ++(int){monster M(*this); health++; return M;}};

monster Vasia;

cout << (Vasia++).get_health();

Перегрузка бинарных операций

Бинарная функция-операция, определяемая внутри класса, должна быть представлена с помощью нестатического метода с параметрами, при этом вызвавший ее объект считается первым операндом:

class monster

{ ...

bool operator >( const monster &M)

{

if( health > M.get_health()) return true;

return false;

}

};

Если функция определяется вне класса, она должна иметь два параметра типа класса:

bool operator >(const monster &M1, const monster &M2)

{ if( M1.get_health() > M2.get_health()) return true;

return false;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]