Zasady ogólne dotyczące przeciążania operatorów
Następujące reguły ograniczają implementacje przeciążonych operatorów.Jednakże, nie dotyczy to operatorów new i delete , które zostały omówione oddzielnie.
Nie można definiować nowych operatorów, tak jak **.
Nie można ponownie zdefiniować znaczenia operatorów po zastosowaniu wbudowanych typów danych.
Przeciążone operatory muszą być albo niestatycznym elementem członkowskim funkcji klasy albo funkcją globalną.Funkcja globalna, która potrzebuje dostępu do prywatnych lub chronionych elementów członkowskich klasy musi być zadeklarowana, jako zaprzyjaźniona z tą klasą.Funkcja globalna musi mieć co najmniej jeden argument klasy lub typu wyliczeniowego lub odwołanie do klasy lub typu wyliczeniowego.Na przykład:
// rules_for_operator_overloading.cpp class Point { public: Point operator<( Point & ); // Declare a member operator // overload. // Declare addition operators. friend Point operator+( Point&, int ); friend Point operator+( int, Point& ); }; int main() { }
Poprzedni przykład kodu deklaruje operator „mniejszy niż” jako element członkowski funkcji; operatory dodawania są zadeklarowane jako globalne funkcje, które mają zaprzyjaźniony dostęp.Należy zauważyć, że więcej niż jedna implementacja może być dostarczona dla danego operatora.W przypadku poprzedniego operatora dodawania, dwie implementacje są dostarczane do ułatwienia przemienności.Jest to tak samo prawdopodobne, że operatory, które dodają Point do Point, int do Point itd., mogą zostać zaimplementowane.
Operatory stosują się do zasad pierwszeństwa, grupowania i liczby operandów podyktowanej ich typowym zastosowaniem w typach wbudowanych.W związku z tym, nie ma sposobu, aby zapisać koncepcje "dodanie 2 i 3 do obiektu typu Point," oczekujemy, aby 2 zostało dodane do współrzędnej x i 3 zostało dodane do współrzędnej y.
Operatory jednoargumentowe deklarowane jako funkcje składowe nie przyjmujące argumentów; jeśli są zadeklarowane jako funkcje globalne, przyjmują jeden argument.
Operatory binarne deklarowane jako funkcje składowe przyjmują jeden argument; jeśli są zadeklarowane jako funkcje globalne, przyjmują dwa argumenty.
Jeśli operator może być używany jako operator jednoargumentowy albo binarny (&, *, +, i -), może doprowadzić do przeciążenia każdego zastosowania osobno.
Przeciążone operatory nie mogą mieć domyślnych argumentów.
Wszystkie przeciążone operatory z wyjątkiem przypisania (operator=) są dziedziczone przez klasy pochodne.
Pierwszy argument dla przeciążonego operatora elementu członkowskiego funkcji, zawsze jest typem klasy obiektu, do którego operator jest wywoływany (klasy, w której operator jest zadeklarowany lub klasa pochodna tej klasy).Konwersje nie są dostarczane do pierwszego argumentu.
Należy zauważyć, że znaczenie któregokolwiek z operatorów może być całkowicie zmienione.W tym znaczenie address-of (&), przypisania (=) i operatory wywołania funkcji.Ponadto tożsamości, które mogą być powoływane dla wbudowanych typów, mogą być zmienione przy użyciu przeładowania operatora.Na przykład, poniższe cztery instrukcje są zazwyczaj równoważne, gdy całkowicie oszacowano:
var = var + 1;
var += 1;
var++;
++var;
Ta tożsamość nie zajdzie dla typów klasy, które przeciążają operatory.Ponadto, niektóre wymagania niejawne w korzystaniu z tych operatorów dla podstawowych typów są złagodzone dla przeciążonych operatorów.Na przykład, operator dodawania/przypisania +=, wymaga lewego operandu l-wartości, po zastosowaniu do podstawowych typów; gdy operator jest przeciążony, nie istnieje taki wymóg.
[!UWAGA]
Dla spójności, często lepiej jest zastosować model wbudowanego typu, podczas definiowania przeciążonych operatorów.Jeżeli semantyka przeciążonych operatorów różni się znacznie od ich znaczenia w innych kontekstach, może być to bardziej skomplikowane niż użyteczne.