C++ Grundkurs

Operatoren überladen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Das Überladen von Operatoren dient in C++ dazu, zusätzliches Verhalten für benutzerdefinierte Operatoren zu implementieren.
05:40

Transkript

In dieser Lektion will ich Ihnen "Operatoren überladen" mit "C++" vorstellen. "Operatoren überladen" heißt, dass Sie Operatoren für eigenen Datentypen anpassen können. Das bedeutet, Sie können eigenen Datentypen in arithmetischen Ausdrücken verwenden, für die Ein- und Ausgabe verwenden. Sie können sie zuweisen wie "Built_in"-Datentypen. Dabei hängt die Anzahl der Operanden von zwei Dingen ab. Welche Art von Operator Sie überladen. Wenn Sie einen Plus-Operator überladen, brauchen Sie natürlich zwei Operanten. Die zwei Werte, die Sie addieren wollen. Wenn Sie z.B. Increment-Operator überladen wollen, brauchen Sie nur einen Wert. Weiter hängt es davon ab, ob Sie den Operator als "Methode" oder als "freistehende Funktion" überladen. In diesem Beispiel habe ich den Operator als Methode überladen. Sie sehen, ich überlade den Operator "Plus-Istgleich" für double. Das heißt, zu Objekten vom Typ Account, wie Sie es hier unten sehen, können Sie einen Double-Wert hinzuaddieren. a+= 100. Obwohl ich hier zwei Operanten habe, das Plus und das 100, benötige ich hier noch einen Operant. Das hängt damit zusammen, dass der erste Operant, das a, dieses Objekt impliziert ist und somit nur noch eines notwendig ist. Beim Operator überladen für freie Funktionen gibt es zwei zusätzliche Regeln. Erstens benötigen Sie alle Argumente und zweitens werden Operatoren, wenn Sie als freie Funktion überladen werden, gerne als "Freund" deklariert. Das hängt damit zusammen, da Sie beim Operator gerne auf die "Interna" einer Klasse eines Objektes zugreifen wollen und das können Sie nur, wenn die Funktion selber Freund der Klasse ist. Noch ein paar Regeln fürs Überladen von Operatoren, bevor ich ein konkretes Beispiel zeige. Die Präzedenz eines Operators kann durch das Überladen nicht verändert werden. Was heißt das? Punkt vor Strich bleibt Punkt vor Strich. Sie können nicht Plus und Mal so überladen, dass Punkt schwächer bindet als Plus. Weiter gilt, dass abgeleitete Klassen alle überladenen Operatoren der Basisklassen erben, mit Ausnahme des Zuweisungsoperators. Der wird nicht vererbt. Der Klammer-Operator hat auch eine besondere Stellung. Er kann als einziger mit Default-Argumenten versehen werden. Der "Klammer-Operator" dient dazu, dass Sie ein Objekt erzeugen, dass sich wie eine Funktion verhält. Das heißt, wie eine Funktion aufgerufen werden kann. Sie können Operatoren aber auch explizit aufrufen. Das sieht nicht besonders schön aus. Sie sehen den Ausdruck hier. Dieser Ausdruck hier "a.operator+=(b)" entspricht "a+=b". Nach der Theorie wie immer die Praxis. Hier die bekannte Klasse Account. Diesmal habe ich für Sie drei Operatoren überladen. Als erstes bekommt die Klasse einen expliziten Konstruktor, den ich mit double füttern kann. Explizit heißt, bei diesem Konstruktor wird keine implizite Konvertierung vom Compiler ausgeführt. Dann besitzt diese Klasse drei überladene Operatoren. Den Operator "+=" als Methode. Den Operator "+=" als freie Funktion und den Operator "<<". Das ist sozusagen der Ausgabeoperator, auch als freie Funktion. Als freie Funktion sehen Sie da, dass der hier nur als "Freund" erklärt ist. Hier unten außerhalb der Klasse wird die Funktion tatsächlich definiert. An dem Beispiel sehen Sie schön den Unterschied zwischen Operator "+=" als "freie Funktion" und als "Methode". Wenn ich es als Methode schreibe, bekommt Operator "+=" nur ein Argument "double b". Wenn ich es als freie Funktion schreibe, bekommt er zwei Argumente, "Account& a" und "Account& b". Mit diesem Operator "+=" kann ich ein Double zu meinen Objekten vom Typ "Account" hinzuaddieren. Mit diesem Operator kann ich zwei Objekte vom Typ Account addieren. In diesem konkreten Fall mache ich es dadurch, dass ich zum linken Argument "a.balance" das rechte Argument "b.balance" dazu addiere. Dann habe ich für die Klasse noch den Ausgabeoperator überladen. Damit Sie sehen, welche Arithmetik ich jetzt gleich betreibe. Der überlade Ausgabeoperator genügt hier folgender Syntax. Er gibt eine Referenz auf einen "ostream" zurück und teilt eine nicht konstante Referenz auf den ostream und das Objekt, die das eben ausgeben will, in diesem Fall soll es hier ein Account sein. Was macht er? Er schiebt seine balance auf den ostream-Operator. Durch das, dass der Ausgabewert hier ostream-Referenz darstellt, können Sie den Ausgabeoperator verknüpfen. Nun zur Anwendung. Hier habe ich Account "acc1" und Account "acc2". Was mache ich im ersten Fall? Zu Account 2acc1" addiere ich 50. Das geht, weil dieser Aufruf "+=" auf diesen Operator hier abgebildet wird. Was macht er? Er rechnet 50 hinzu, gibt sich selbst als Pointer zurück. Im nächsten Schritt addiert er sich zu sich selber. Was kommt raus? 100 plus 50 ist 150. 150 plus 150 ist 300. Im zweiten Schritt habe ich "acc2" und da rechne ich auf diese sehr umständliche Art 50 dazu und 100 plus 50 ist 150. Das bekomme ich auch hier als Ergebnis raus. Dass ich das hier rausgebe kann, hängt damit zusammen, dass ich den Ausgabeoperator für meinen Datentyp überladen habe. Das ist hier oben. Das hier geht nicht gut. Warum geht das nicht gut? Ich will ein acc2-Objekt zu sich selbst hinzu addieren. Wenn Sie aber genau hinsehen, ist mein "+="-Operator nur für "double" definiert, aber nicht für "Account". Was kann ich machen? Ich könnte z.B. einen Konvertierungsoperator schreiben, der mir ein Account-Objekt in double konvertiert. In dieser Lektion habe ich Ihnen "Operator überladen" mit "C++" vorgestellt. Ich bin insbesondere darauf eingegangen, dass sich Operatoren in zwei Formen überladen können, als Methode und als freie Funktion. Wenn Sie einen Operator als freie Funktion überladen, sollten Sie diese in der Regel als "Freund" erklären.

C++ Grundkurs

Steigen Sie in die mächtige Programmiersprache C++ ein und lernen Sie dabei alle wichtigen Funktionen mit Anwendungsbeispielen kennen.

8 Std. 14 min (147 Videos)
Derzeit sind keine Feedbacks vorhanden...

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!