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:
=
[]
()
->