Zasady ogólne dotyczące przeciążania operatorów

Następujące reguły ograniczają sposób implementacji przeciążonych operatorów. Nie mają one jednak zastosowania do nowych i usuniętych operatorów, które są objęte oddzielnie.

  • Nie można zdefiniować nowych operatorów, takich jak ..

  • Nie można ponownie zdefiniować znaczenia operatorów po zastosowaniu wbudowanych typów danych.

  • Przeciążone operatory muszą być niestatyczną funkcją składową klasy lub funkcją globalną. Funkcja globalna, która wymaga dostępu do prywatnych lub chronionych składowych, klasy musi być zadeklarowana jako zaprzyjaźniona z tą klasą. Funkcja globalna musi mieć przynajmniej 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 funkcję członkowską; jednakże operatory dodawania są zadeklarowane jako funkcje globalne, które mają dostęp zaprzyjaźniony. 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 w celu ułatwienia przemienności. Równie prawdopodobne jest, że operatory, które dodają PointPointelement do elementu , int do Pointelementu i tak dalej, mogą być implementowane.

  • Operatory przestrzegają zasad pierwszeństwa, grupowania i liczby operandów podyktowanej ich typowym zastosowaniem w typach wbudowanych. W związku z tym nie ma możliwości wyrażenia koncepcji "dodaj 2 i 3 do obiektu typu Point", spodziewając się, że 2 zostaną dodane do współrzędnych x i 3 do dodania do współrzędnej y .

  • Operatory jednoargumentowe deklarowane jako funkcje członkowskie nie przyjmują argumentów; jeśli są zadeklarowane jako funkcje globalne, przyjmują jeden argument.

  • Operatory binarne deklarowane jako funkcje członkowskie przyjmują jeden argument; jeśli są zadeklarowane jako funkcje globalne, przyjmują dwa argumenty.

  • Jeśli operator może być używany jako jednoargumentowy lub binarny operator (&, *, +i -), można przeciążyć każde użycie oddzielnie.

  • Przeciążone operatory nie mogą mieć argumentów domyślnych.

  • Wszystkie przeciążone operatory z wyjątkiem przypisania (operator=) są dziedziczone przez klasy pochodne.

  • Pierwszy argument dla przeciążonego operatora funkcji składowej jest zawsze typem klasy obiektu, dla którego operator jest wywoływany (klasy, w której operator jest zadeklarowany lub klasa pochodnej dla tej klasy). Konwersje nie są dostarczane dla pierwszego argumentu.

Należy zauważyć, że znaczenie któregokolwiek z operatorów może być całkowicie zmienione. Obejmuje to znaczenie operatorów adres-of (&), assignment (=) i function-call. Tożsamości, które mogą być powoływane dla wbudowanych typów, mogą być zmienione za pomocą przeciążenia operatora. Na przykład, poniższe cztery instrukcje są zazwyczaj równoważne po całkowitym obliczeniu:

var = var + 1;
var += 1;
var++;
++var;

Ta tożsamość nie może polegać na typach klasy, które przeciążają operatory. Ponadto, niektóre wymagania niejawne w korzystaniu z tych operatorów dla typów podstawowych są złagodzone dla operatorów przeciążonych. Na przykład operator +=dodawania/przypisania wymaga, aby lewy operand był wartością l w przypadku zastosowania do typów podstawowych; nie ma takiego wymagania, gdy operator jest przeciążony.

Uwaga

Aby zapewnić spójność, najlepiej posługiwać się modelem typów wbudowanych podczas definiowania operatorów przeciążonych. Jeżeli semantyka operatorów przeciążonych różni się znacznie od ich znaczenia w innych kontekstach, może być to bardziej skomplikowane niż użyteczne.

Zobacz też

Przeładowanie operatora