Einführung in die Operatorüberladung
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 40 von 104.
Operatorüberladung ermöglicht es dir, festzulegen, wie sich Operatoren wie +, - oder == verhalten, wenn sie mit deinen eigenen Klassen verwendet werden. Anstatt Methoden wie a.add(b) aufzurufen, kannst du die intuitivere Schreibweise a + b verwenden.
In C++ sind operators im Wesentlichen Funktionen mit speziellen Namen. Um einen operator zu überladen, definierst du eine Funktion mit dem Schlüsselwort operator, gefolgt vom Symbol:
class Vector2D {
double x, y;
public:
Vector2D(double x, double y) : x(x), y(y) {}
// Überlade den + Operator
Vector2D operator+(const Vector2D& other) const {
return Vector2D(x + other.x, y + other.y);
}
};Jetzt kannst du zwei Vektoren ganz natürlich addieren:
Vector2D v1(1.0, 2.0);
Vector2D v2(3.0, 4.0);
Vector2D v3 = v1 + v2; // Ruft v1.operator+(v2) aufNicht alle Operatoren können überladen werden. Der Bereichsauflösungsoperator ::, der member-Zugriff ., der ternäre Operator ?: und sizeof können nicht überladen werden. Außerdem kannst du keine neuen Operatoren erstellen oder die Priorität eines Operators ändern – * wird immer vor + ausgewertet.
Operatoren können als member-Funktionen (wie oben) oder als Nicht-member-Funktionen implementiert werden. In den kommenden Lektionen lernst du, wann du welchen Ansatz verwenden solltest und wie du bestimmte Kategorien von Operatoren überlädst.
Aufgabe
EinfachErstellen wir eine Point-Klasse, die eine 2D-Koordinate darstellt und das Addieren zweier Punkte mithilfe des +-Operators unterstützt. Dies ist dein erster Schritt in die Operatorüberladung, durch die deine eigenen Klassen mit vertrauten Operatoren funktionieren.
Du erstellst zwei Dateien, um deinen Code zu organisieren:
Point.h: Definiere einePoint-Klasse, die x- und y-Koordinaten (beideint) speichert. Deine Klasse sollte Folgendes enthalten:- Private Member für die x- und y-Koordinaten
- Einen Konstruktor, der x- und y-Werte entgegennimmt
- Getter
getX()undgetY()(beide const) - Einen überladenen
+-Operator, der zwei Punkte addiert und einen neuenPointmit den kombinierten Koordinaten zurückgibt
Der
+-Operator sollte als Memberfunktion implementiert werden, die einen anderenPointals konstante Referenz entgegennimmt und einen neuenPointzurückgibt. Markiere ihn alsconst, da er keinen der beiden Operanden verändert.main.cpp: Lies vier Ganzzahlen aus der Eingabe (x1, y1, x2, y2 in separaten Zeilen), die zwei Punkte darstellen. Erstelle zweiPoint-Objekte, addiere sie mithilfe des+-Operators und gib die Ergebnisse aus.Ausgabeformat:
Point 1: (<x1>, <y1>) Point 2: (<x2>, <y2>) Sum: (<sum_x>, <sum_y>)
Die wichtigste Erkenntnis hierbei ist, dass p1 + p2 hinter den Kulissen tatsächlich p1.operator+(p2) aufruft. Dein überladener Operator ermöglicht es dir, intuitiven Code wie Point p3 = p1 + p2; zu schreiben, statt etwas wie Point p3 = p1.add(p2);.
Konvertiere Eingabezeichenfolgen mithilfe von std::stoi() in Ganzzahlen. Vergiss die Header-Guards in deiner Header-Datei nicht.
Probier es selbst
#include <iostream>
#include <string>
#include "Point.h"
using namespace std;
int main() {
// Eingabe lesen
string line1, line2, line3, line4;
getline(cin, line1);
getline(cin, line2);
getline(cin, line3);
getline(cin, line4);
int x1 = stoi(line1);
int y1 = stoi(line2);
int x2 = stoi(line3);
int y2 = stoi(line4);
// TODO: Erstelle zwei Point-Objekte mit den Eingabewerten
// TODO: Addiere die beiden Punkte mit dem + Operator
// TODO: Gib die Ergebnisse im erforderlichen Format aus:
// Punkt 1: (<x1>, <y1>)
// Punkt 2: (<x2>, <y2>)
// Summe: (<sum_x>, <sum_y>)
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamespaces & GültigkeitsbereichEinführung in OOP mit C++Klassen vs. ObjekteDer „this“-ZeigerMethoden (Member-Funktionen)Attribute (Datenmember)Grundlagen zu Ctors & DtorsRückblick – Einfacher Taschenrechner4Klassenattribute
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen und -KlassenZusammenfassung – Bankkontoverwaltung7Vererbung
Grundlagen der VererbungZugriffsebenen bei der VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick – Mitarbeiterhierarchie2Speicherverwaltung
Stack- vs. Heap-SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Intelligente Zeiger in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsbezeichner in C++Zugriffsbezeichner im DetailInformationsverbergungStruct vs. KlasseVerschachtelte und innere KlassenWiederholung – Studierendenverwaltungssystem8Polymorphie
Polymorphie zur Compilezeit vs. LaufzeitFunktionsüberladungVirtuelle Funktionen erneut betrachtetRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIRückblick – Shape-Calculator3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorMove-KonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktor im DetailDrei-/Fünf-/Null-RegelZusammenfassung – String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladung der Operatoren [] und ()TypkonvertierungsoperatorenWiederholung – Matrix-Klasse9Templates
FunktionstemplatesKlassen-TemplatesTemplate-SpezialisierungVariadische TemplatesGrundlagen zu SFINAE und Type TraitsRückblick – Generischer ContainerÜbe selbstständig: Online-C++-Compiler