Здавалка
Главная | Обратная связь

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



В С++ есть возможность распространения действия стандартных операций на операнды абстрактных типов данных. Для того, чтобы переопределить одну из стандартных операций для работы с операндами абстрактных типов, программист должен написать функцию с именем operator знак, где знак - обозначение этой операции (например, + - | += и т.д.).

Однако в языке существует несколько ограничений, накладываемых на переопределение операторов:

  1. Нельзя создавать новые символы операций.
  2. Нельзя переопределять операции:
::* (разыменование, а не бинарное умножение)?: sizeof## #.
  1. Cимвол унарной операции не может использоваться для переопределения бинарной операции и наоборот. Например, символ << можно использовать только для бинарной операции, ! - только для унарной, а & - и для унарной, и для бинарной.
  2. Переопределение операций не меняет ни их приоритетов, ни порядка их выполнения (слева направо или справа налево).
  3. При перегрузке операции компьютер не делает никаких предположений о ее свойствах. Это означает, что если стандартная операция += может быть выражена через операции + и =, т.е. а + = b эквивалентно а = а + b, то для переопределения операций в общем таких соотношений не существует, хотя, конечно, программист может их обеспечить.
  4. Никакая операция не может быть переопределена для операндов стандартных типов.
  5. Как для унарной, так и для бинарной операции число аргументов функции operator () должно точно соответствовать числу операндов этой операции. Причем в перегрузку бинарного оператора принято передавать один аргумент, так как второй - неявный. Его имеет любая функция - член класса, это тот самый указатель this - указатель на объект, для которого вызван метод. Таким образом, в переопределение унарного оператора не следует передавать ничего вовсе.

Примечание:Кстати!! Удобно передавать значения параметров в функцию operator() не по значению, а по ссылке.

Пример.

#include <iostream> using namespace std;class Digit{ private: int dig; // число public: Digit(){ dig=0; } Digit(int iDig){ dig=iDig; } void Show(){ cout<<dig<<"\n"; } // перегружаем четыре оператора // обратите внимания, все операторы // бинарные, поэтому мы передаем в // них один параметр - это операнд, // который будет находиться справа // от оператора в выражении // левый операнд передается с помощью this Digit operator+(const Digit &N) { Digit temp; temp.dig=dig+N.dig; return temp; } Digit operator-(const Digit &N) { Digit temp; temp.dig=dig-N.dig; return temp; } Digit operator*(const Digit &N) { Digit temp; temp.dig=dig*N.dig; return temp; } Digit Digit::operator%(const Digit &N) { Digit temp; temp.dig=dig%N.dig; return temp; } };void main(){ // проверяем работу операторов Digit A(8),B(3); Digit C; cout<<"\Digit A:\n"; A.Show(); cout<<"\Digit B:\n"; B.Show(); cout<<"\noperator+:\n"; C=A+B; C.Show(); cout<<"\noperator-:\n"; C=A-B; C.Show(); cout<<"\noperator*:\n"; C=A*B; C.Show(); cout<<"\noperator%:\n"; C=A%B; C.Show();}
Предыдущая Оглавление Следующая
Предыдущая Оглавление Следующая






©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.