C++ Überladen von Operatoren und Überladen von Funktionen

C++ erlaubt, dass eine bestimmte [Funktion] im selben GültigkeitsbereichFunktionundOperatorenmehrere Definitionen angeben, die jeweils alsFunktionsüberladung bezeichnet werdenundOperatorüberladung。

Eine Überladungsdeklaration ist eine Deklaration, die denselben Namen wie eine zuvor in diesem Gültigkeitsbereich deklarierte Funktion oder Methode hat, aber ihre Parameterlisten und Definitionen (Implementierungen) sind unterschiedlich.

Wenn Sie eineüberladene Funktionoder einenüberladenen Operator aufrufen,entscheidet der Compiler, welche Definition am besten geeignet ist, indem er die von Ihnen verwendeten Parametertypen mit den Parametertypen in der Definition vergleicht. Der Prozess der Auswahl der am besten geeigneten überladenen Funktion oder des am besten geeigneten überladenen Operators heißtÜberladungsauflösung。

Funktionsüberladung in C++

Im selben Gültigkeitsbereich können Sie mehrere Funktionen mit ähnlicher Funktionalität und demselben Namen deklarieren, aber diese gleichnamigen Funktionen müssen unterschiedliche formale Parameter haben (bezogen auf Anzahl, Typ oder Reihenfolge der Parameter). Sie können Funktionen nicht allein anhand unterschiedlicher Rückgabetypen überladen.

Im folgenden Beispiel werden Funktionen mit demselben Namenprint()verwendet, um verschiedene Datentypen auszugeben:

Beispiel

#include <iostream> using namespace std; class printData { public: void print(int i) { cout << "Die Ganzzahl ist:" << i << endl; } void print(double f) { cout << "Die Gleitkommazahl ist:" << f << endl; } void print(char c[]) { cout << "Die Zeichenkette ist:" << c << endl; } }; int main(void) { printData pd; // Ganzzahl ausgeben pd.print(5); // Ausgabe einer Gleitkommazahl pd.print(500.263); // Ausgabe einer Zeichenkette char c[] = "Hello C++"; pd.print(c); return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

整数为: 5
浮点数为: 500.263
字符串为: Hello C++

Operatorüberladung in C++

Sie können die meisten in C++ integrierten Operatoren neu definieren oder überladen. Auf diese Weise können Sie Operatoren mit benutzerdefinierten Typen verwenden.

Überladene Operatoren sind Funktionen mit speziellen Namen. Der Funktionsname setzt sich aus dem Schlüsselwort `operator` gefolgt vom zu überladenden Operatorsymbol zusammen. Wie andere Funktionen hat ein überladener Operator einen Rückgabetyp und eine Parameterliste.

Box operator+(const Box&);

Deklarieren Sie den Additionsoperator, um zwei Box-Objekte zu addieren und das endgültige Box-Objekt zurückzugeben. Die meisten überladenen Operatoren können als gewöhnliche Nicht-Member-Funktionen oder als Klassenmemberfunktionen definiert werden. Wenn wir die obige Funktion als Nicht-Member-Funktion der Klasse definieren, müssen wir für jede Operation zwei Parameter übergeben, wie unten gezeigt:

Box operator+(const Box&, const Box&);

Das folgende Beispiel demonstriert das Konzept der Operatorüberladung unter Verwendung von Memberfunktionen. Hier werden Objekte als Argumente übergeben, und auf die Eigenschaften des Objekts wird mithilfe desthis-Operators zugegriffen, wie unten gezeigt:

Beispiel

#include <iostream> using namespace std; class Box { public: double getVolume(void) { return length * breadth * height; } void setLength( double len ) { length = len; } void setBreadth( double bre ) { breadth = bre; } void setHeight( double hei ) { height = hei; } // Überladen Sie den +-Operator, um zwei Box-Objekte zu addieren Box operator+(const Box& b) { Box box; box.length = this->length + b.length; box.breadth = this->breadth + b.breadth; box.height = this->height + b.height; return box; } private: double length; // Länge double breadth; // Breite double height; // Höhe }; // Die Hauptfunktion des Programms int main( ) { Box Box1; // Deklariere Box1 vom Typ Box Box Box2; // Deklariere Box2 vom Typ Box Box Box3; // Deklariere Box3 vom Typ Box double volume = 0.0; // Speichere das Volumen in dieser Variable // Details zu Box1 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // Details zu Box2 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // Volumen von Box1 volume = Box1.getVolume(); cout << "Volumen von Box1 : " << volume <<endl; // Volumen von Box2 volume = Box2.getVolume(); cout << "Volumen von Box2 : " << volume <<endl; // Addiere die beiden Objekte, um Box3 zu erhalten Box3 = Box1 + Box2; // Volumen von Box3 volume = Box3.getVolume(); cout << "Volumen von Box3 : " << volume <<endl; return 0; }

Wenn der obige Code kompiliert und ausgeführt wird, liefert er die folgenden Ergebnisse:

Volume of Box1 : 210
Volume of Box2 : 1560
Volume of Box3 : 5400

Überladbare Operatoren / Nicht überladbare Operatoren

Das Folgende ist eine Liste von Operatoren, die überladen werden können:

Binäre arithmetische Operatoren + (Addition), - (Subtraktion), * (Multiplikation), / (Division), % (Modulo)
Relationale Operatoren == (gleich), != (ungleich), < (kleiner als), > (größer als), <= (kleiner oder gleich), >= (größer oder gleich)
Logische Operatoren || (logisches ODER), && (logisches UND), ! (logisches NICHT)
Unärer Operator + (positiv), - (negativ), * (Dereferenzierung), & (Adressoperator)
Inkrement- und Dekrementoperatoren ++ (Inkrement), -- (Dekrement)
Bitweise Operatoren | (bitweises ODER), & (bitweises UND), ~ (bitweises NICHT), ^ (bitweises XOR), << (Linksverschiebung), >> (Rechtsverschiebung)
Zuweisungsoperatoren =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
Speicherzuweisung und -freigabe new, delete, new[ ] , delete[]
Weitere Operatoren ()(Funktionsaufruf),->(Elementzugriff),,(Komma),[](Index)

Die folgende Liste enthält Operatoren, die nicht überladen werden können:

  • .Elementzugriffsoperator
  • .*, ->*Elementzeiger-Zugriffsoperator
  • ::: Bereichsoperator
  • sizeof: Längenoperator
  • ?:: Bedingungsoperator
  • #: Präprozessorsymbol

Beispiel für Operatorüberladung

Im Folgenden erhalten Sie verschiedene Beispiele für Operatorüberladung, um das Konzept der Überladung besser zu verstehen.

Laufende NummerOperatoren und Beispiele
1Überladen unärer Operatoren
2Binäre Operatorüberladung
3Relationale Operatorüberladung
4Ein-/Ausgabe-Operatorüberladung
5Überladen der Operatoren ++ und --
6Überladung des Zuweisungsoperators
7Überladen des Funktionsaufrufoperators ()
8Überladen des Indexoperators []
9Überladen des Klassenmember-Zugriffsoperators ->
Weitere Erweiterungen