Перегрузка операторов.
В С++ есть возможность распространения действия стандартных операций на
операнды абстрактных типов данных. Для того, чтобы переопределить одну из
стандартных операций для работы с операндами абстрактных типов, программист
должен написать функцию с именем operator знак, где знак - обозначение
этой операции (например, + - | += и т.д.).
Однако в языке существует несколько ограничений, накладываемых на
переопределение операторов:
- Нельзя создавать новые символы операций.
- Нельзя переопределять операции:
::
* (разыменование, а не бинарное умножение)
?:
sizeof
##
#
.
|
- Cимвол унарной операции не может использоваться для переопределения бинарной
операции и наоборот. Например, символ << можно использовать только для
бинарной операции, ! - только для унарной, а & - и для унарной, и для
бинарной.
- Переопределение операций не меняет ни их приоритетов, ни порядка их
выполнения (слева направо или справа налево).
- При перегрузке операции компьютер не делает никаких предположений о ее
свойствах. Это означает, что если стандартная операция += может быть выражена
через операции + и =, т.е. а + = b эквивалентно а = а + b, то для
переопределения операций в общем таких соотношений не существует, хотя, конечно,
программист может их обеспечить.
- Никакая операция не может быть переопределена для операндов стандартных
типов.
- Как для унарной, так и для бинарной операции число аргументов функции
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();
}
|
|