Was ist der Sinn hinter dem Überladen von Operatoren in C++ und wie funktioniert das genau?
Hi, wir haben uns gerade in der Vorlesung mit diesem Thema beschäftigt, ich habe aber nicht wirklich verstanden wie das funktioniert und wozu das ganze gut sein soll...
War leider auf Englisch, aber unser Prof hatte irgendwie was davon erzählt, dass das Überladen von Operatoren nützlich ist wenn man zb Plusrechnen mit dem + Operator nicht nur auf Zahlen beziehen möchte.
Man könnte ja auch irgendwie Objekte zusammenzählen, die man in irgendwelchen Klassen definiert hat.
Ich verstehe das irgendwie nur zur Hälfte, macht es Sinn sich das so vorzustellen, dass c++ Vektoren normal nicht über den + Operator addieren kann, und ich den Operator dann "überlade" und ihm damit die nötige zusätzliche Funktion dafür gebe und er danach zb auch Vektoren die ich über eine Klasse oder ein Struct definiert habe zusammenrechnen kann ?
Und ich frage mich etwas wie die überladung dann genau funktioniert, irgendwie unterscheiden sich diese dann ja weil es ja unäre und äre operatoren gibt, also welche die sich nur auf ein oder zwei Objekte beziehen...
Wäre nett wenn mir jemand weiterhelfen könnte.
Das hier ist zb eine Überladung des + Operators die ich nicht verstehe, was bezwecke ich damit ? Dass ich 2 Objekte des Typs RationalNumber die ich davor in einer Klasse definiert habe addieren kann ?
1 Antwort
Operator Overloading dient eben dazu bestimmte Operatoren für einen Datentyp eigen zu definieren.
ZB macht es keinen Sinn zwei Strings mathematisch zu addieren, aber man kann zB den Additionsoperator überladen und damit das Zusammenfügen der Strings erreichen.
Also str1="Hello " str2="World" dann ist str1 + str2 = "Hello World".
Für Vektoren gilt natürlich das selbe. Der Compiler weiß ja zunächst nicht was der + oder - Operator bei bestimmten Klassen machen soll, mittels overloading definiert man das eben.
Ob du einen Operator unär oder binär überlädst hängt davon ab ob du ihn für eine Klasse definierst oder in einer Klasse. In einer Klasse ists klar, dass ein Argument immer this sein wird. Außerhalb einer Klasse muss dieser natürlich zwei Argumente haben.
Achsoo, das macht irgendwie Sinn...
Nehmen wir an ich definiere mir einen Datentyp Vektor mit dem ich Vektoren darstellen möchte. Diese bestehen ja immer aus x1 x2 x3 bzw aus x y und z. Definiere ich mir jetzt 2 Vektoren und möchte diese zusammenrechnen, dann kann ich das zunächst über den normalen + Operator nicht tun, da dieser normal nur für Zahlen funktioniert.
Was ich jetzt machen kann, ich nehme den Operator und Überlade ihn für den Datentyp Vektor einzeln, dann kann ich dem Operator zuweisen was er bei der Addition von 2 Vektoren zu tun hat. Ich schreibe also eine Funktion wo definiert wird was bei der Vektoraddition zu tun ist und schreibe in diese operator+ rein, und gebe dann einen Vektor vom Datentyp Vektor zurück. Damit habe ich definiert wie die Vektoraddition genau funktioniert, und ab dann kann ich den Operator auch für den Datentyp bzw. meine Klasse Vektor anwenden.
Kommt das so hin ? :)
Ja das ist richtig. Das selbe gilt natürlich auch für viele andere Operatoren.
Typisches Beispiel ist zB auch der Bitshift Operator bei Streams also cout << 2; Da cout ein Stream ist wird diese Operation mit der Ausgabe und Umwandelung des int 2 in den string 2 überladen.
Bei deinem str1-Beispiel fehlt ein Anführungszeichen :)