Przeładowanie operatorów
Przeładowania operatorów dokonuje się definiując swoją własną funkcję, która:
o
nazywa się operator@ - gdzie @ oznacza symbol operatora, który
chcemy przeładować
o
jako co najmniej jeden z argumentów przyjmuje obiekt danej klasy
(obiekt, nie wskaźnik do obiektu)
typ_zwracany operator@ ( argumenty )
{
//ciało funkcji
}
Lista operatorów, które można przeładowywać:
!
++
--
, +
-
*
/
%
^
&
|
~
=
<
>
+=
-=
*=
/=
%=
^=
&=
|=
<<
>>
<<= >>= = =
!=
<=
>=
&&
||
->*
->*
new
delete ()
[]
Operatory, których nie można przeładować:
.
- tak się odnosimy do składnika klasy;
.*
- tak wybieramy składnik wskaźnikiem
::
- tak określamy zakres
Sposoby
definiowana
operatorów
przeładowanych
(funkcji
operatorowych):
o
Jako funkcja składowa klasy ( wymaga aby obiekt stojący po lewej
stronie operatora był obiektem jej klasy),
o
Jako zwykła funkcja globalna
Jeśli operator definiujemy jako funkcję składową klasy, to ma ona zawsze o
jeden argument mniej niż ta sama funkcja napisana w postaci funkcji globalnej.
Spowodowane jest to istnieniem wskaźnika this.
Kiedy operator ma być funkcją składową a kiedy globalną?
o
Jeżeli zmienia w jakiś sposób obiekt, na którym pracuje, to powinien być
zdefiniowany jako funkcja składowa klasy. Operator zwraca wtedy
l wartość, np. =
++
--
+= -=
o
Jeśli operator nie modyfikuje obiektu, wówczas powinien być w postaci
funkcji globalnej.
Wyjątek:
Cztery operatory, które musza być niestatycznymi funkcjami składowymi:
=
[]
()
->