Hintergrund
C++ wurde von Anfang an als Sprache konzipiert, die Funktionsüberladung unterstützt — die Möglichkeit, mehrere Funktionen mit demselben Namen, aber unterschiedlichen Parametern zu deklarieren. Dies ermöglicht die Erstellung einer lesbaren und benutzerfreundlichen API.
Problem
Wenn es viele Funktionen mit denselben Namen gibt, muss der Compiler die passende Implementierung aus allen überladenen wählen, wobei er die Typen der Argumente, Konvertierungen, Standardparameter und Referenzen berücksichtigt. Bei unsachgemäßer Überladung entstehen Mehrdeutigkeiten und schwer fassbare Fehler.
Lösung
Der Compiler wählt die Funktion basierend auf der besten Übereinstimmung der Argumentenfolge, der Genauigkeit der Typübereinstimmung und der minimalen Konvertierungen. Dabei sind jedoch Nuancen zu beachten: Wenn es signifikante Konvertierungen oder Standardparameter gibt, kann unerwartete Mehrdeutigkeit auftreten.
Beispielcode:
void foo(int x); void foo(double x); void foo(int x, int y = 0); foo(5); // ruft void foo(int x) auf, weil es eine genaue Übereinstimmung ist foo(5.2); // ruft void foo(double x) auf foo(5, 6); // ruft void foo(int x, int y) auf
Wichtige Besonderheiten:
Kann man Funktionen nur nach Rückgabetyp überladen?
Nein. Überladung ist nur nach Typ und Anzahl der Parameter möglich, der Rückgabetyp spielt keine Rolle bei der Überlastungsauflösung.
int foo(); double foo(); // Fehler: Überladung nur nach Rückgabewerttyp ist nicht möglich!
Wie wählt der Compiler aus, welche überladene Funktion aufgerufen werden soll, wenn alle Parameter konvertierbar sind?
Der Compiler wählt die "beste Übereinstimmung" – die Funktion, für die die minimale Anzahl von Typkonvertierungen erforderlich ist, oder die eine genaue Übereinstimmung. Wenn es Mehrdeutigkeit gibt, wird der Code nicht kompiliert.
void bar(int); void bar(long); bar(1); // int genaue Übereinstimmung: es wird bar(int) aufgerufen
Kann man Überladung von Standardparametern und normaler Überladung mischen?
Ja, aber es kann zu Mehrdeutigkeit beim Aufruf kommen, wenn die Funktionssignaturen sich überschneiden.
void test(int x); void test(int x, int y = 10); test(5); // Fehler: Mehrdeutigkeit — beide passen
In der Bibliothek gibt es überladene Funktionen mit sich überschneidenden Standardparametern, was beim Aktualisieren des Codes zu Kompilierungsfehlern führt.
Vorteile:
Nachteile:
Im Projekt wurde eine Vereinbarung getroffen — Überladungen mit Standardparametern nicht zu mischen oder entweder nur eine Funktion mit Standardwerten zu verwenden oder ausschließlich nach einzigartigen Parametern zu überladen.
Vorteile:
Nachteile: