Operator Overloading in C++

K

kneitzel

Gast
Also anschaulich zeigt es z.B. ein Vergleich mit Java, das kein Operator Overloading kennt.

a) Vergleich von Objekten. In Java muss man equals verwenden. Sprachen mit Operator Overloading nutzen einfach ein ==.
b) Bigdezimal: In Java darf man schön Methoden nutzen a.la. b1.add(b2) und mit Operator Overloading hat man einfach ein b1 + b2.
 

Devanther

Top Contributor
Das Problem ist, ich verstehe nicht, WARUM das gemacht wird?
Warum dieser Aufwand?
Wenn man das macht, was ist dadurch möglich geworden?
Kann das jemand in eigenen Worten erklären, bitte?

In Java und Phyton gibt es das ja nicht.

btw: Was ist der Unterschied zwischen einer Referenz und einem Pointer?
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Die Beispiele hast Du doch bekommen und die Zeigen es doch recht deutlich.

Und es geht nicht darum, dass etwas neues möglich wird, was ohne nicht gehen würde. Es geht einfach um gut lesbaren Code. Schau dir doch einfach die genannten Beispiele im Detail an ... oder alleine die ganzen Probleme, die hier ständig im Forum aufschlagen, weil Anfänger Objekte mit == vergleichen ...
 

LimDul

Top Contributor
Ganz banal: Folgende Rechnung mit und Ohne Operator Overlading

Gerechnet werden soll: 5.2 * (3.1 + 4.2)

Ohne
Java:
BigDecimal result = new BigDecimal("5.2").multiply(new BigDecimal("3.1").add(new BigDecimal("4.2")));

Mit
Java:
BigDecimal result = new BigDecimal("5.2") * (new BigDecimal("3.1") + new BigDecimal("4.2"));

Was ist lesbarer?
 

Devanther

Top Contributor
@LimDul
Danke für das Beispiel!

Vielleicht noch eine Erklärung was der Unterschied zwischen einer Referenz und einem Pointer ist? ^^ -.-
Irgendwie ist C++ schwerer als Java oder Phyton...abgesehen von Generics in Java.
 
Zuletzt bearbeitet:

Devanther

Top Contributor

References vs Pointers​

References are often confused with pointers but three major differences between references and pointers are −

  • You cannot have NULL references. You must always be able to assume that a reference is connected to a legitimate piece of storage.
  • Once a reference is initialized to an object, it cannot be changed to refer to another object. Pointers can be pointed to another object at any time.
  • A reference must be initialized when it is created. Pointers can be initialized at any time.
 
K

kneitzel

Gast

References vs Pointers​

References are often confused with pointers but three major differences between references and pointers are −

  • You cannot have NULL references. You must always be able to assume that a reference is connected to a legitimate piece of storage.
  • Once a reference is initialized to an object, it cannot be changed to refer to another object. Pointers can be pointed to another object at any time.
  • A reference must be initialized when it is created. Pointers can be initialized at any time.
Wo hast Du das gefunden? Und das gilt so nicht für Java würde ich sagen. Denn String string1 = null; erzeugt mir ja eine Null Reference in Variable string1. Und ich kann string1 = "hallo"; danach schreiben und die Referenz sozusagen überschreiben. Und ich muss es nicht initialisieren, wenn ich es erzeuge. In einer Methode kann ich erst eine Variable deklarieren um diese dann später zu initialisieren.

Daher wäre der Kontext dieses Ausschnitts interessant (Und ganz nebenbei sollte man sich angewöhnen beim Copy & Paste die Quelle zu nennen ...)
 

Devanther

Top Contributor
 

fhoffmann

Top Contributor
Neben allen - bereits erwähnten - technischen Unterschieden habe ich das Gefühl, dass man einen Pointer am liebsten benutzt, wenn man den Pointer mit new (auf dem Heap) erzeugt hat, und dass man eine Referenz benutzt, wenn man eine Variable (auf dem Stack) erzeugt hat und dennoch eine Übergabe "by reference" wünscht.
Code:
main() {
    int* pi = new int(7);
    foo(pi);
    delete pi;
   
    int i = 7;
    bar(i);
   
    int j = 7;
    baz(j); // wirkungslos
)

void foo(int* pi) {
    *pi = 8;
}

void bar(int& i) {
    i = 8;
}

void baz(int i) {
    i = 8;
}
 

fhoffmann

Top Contributor
Zu deiner ursprünglichen Frage noch eine Anmerkung:
Möglicherweise fand Bjarne Stroustrup im Jahr 1979 (bei der Entwicklung von C++) Operator-Overloading als hilfreich (es ist ja auch manchmal ganz hübsch, insbesondere, weil es auch automatisch Prioritätsregeln kennt (Punktrechnung vor Strichrechnung)), und zwanzig Jahre später (bei der Entwicklung von Java) hat man gesehen, dass das Operator-Overloading dann doch nicht so hilfreich ist, dass sich die ganze Mühe lohnt.

EDIT: Und außerdem sind in C++ auch "new", "delete" und "*" (die Derefernzierung) Operatoren, die man überschreiben kann. Damit kann man unglaubliche Dinge treiben (die allerdings kaum jemand versteht).

EDIT 2: Außerdem ist es in C++ guter Stil, den Zuweisungsoperator ("=") zu überschreiben. Das ist in Java natürlich nicht notwendig, da hier die Reference (in der Bedeutung von Java) übergeben wird.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
und zwanzig Jahre später (bei der Entwicklung von Java) hat man gesehen, dass das Operator-Overloading dann doch nicht so hilfreich ist, dass sich die ganze Mühe lohnt.
Ja, das die Java Entwickler so entschieden haben, sehen wird. Aber man sieht auch, dass dies nichts ist, das man mit der Zeit eingesehen hat.
Denn in der weiteren Entwicklung sieht man viele Sprachen, die dies ebenfalls bieten: C#, Swift, Kotlin, ...

Ich finde dies auf jeden Fall schade, denn es würde einem ermöglichen, besser lesbaren Code zu bekommen.
 

fhoffmann

Top Contributor
Wir sind uns doch fast einig:
- Operator-Overloading macht den Code (manchmal) lesbarer,
- Operator-Overloading macht den Compiler komplizierter und das Lernen der Programmiersprache (etwas) schwerer.
Das ist ein Interessenkonflikt, in dem man sich so oder so entscheiden kann.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Wir sind uns doch fast einig:
- Operator-Overloading macht den Code (manchmal) lesbarer,
- Operator-Overloading macht den Compiler komplizierter und das Lernen der Programmiersrache (etwas) schwerer.
Das ist ein Interessenkonflikt, in dem man sich so oder so entscheiden kann.
Ja natürlich. Ich hatte das auch nur erwähnt, da man in Deinen Post vielleicht rein interpretieren könnte, dass da über die Zeit eine neue Erkenntnis gekommen ist, was besser ist ... Ich gehe auch davon aus, dass dies nicht deine Aussage sein sollte.
 

Devanther

Top Contributor
Was ist der Unterschied zwischen .cpp und .h Files?

Welche Rolle erfüllen beide Arten von Klassen?

Wenn man einen Pointer erstellt hat muss man mit "->" statt "." die Methode aufrufen?
 
Zuletzt bearbeitet:

thecain

Top Contributor
Dann weisst du ja wo du nachschauen kannst.

Was macht xy? Was ist xy? Dafür brauchst du doch nicht das Forum. Du lernst jetzt seit mehreren Jahren Programmieren, da solltest du doch langsam gemerkt haben, dass man manchmal selber ein bisschen recherchieren und mehrere Artikel lesen muss, bis man etwas verstanden hat.
 

Thallius

Top Contributor
Wer den Unterschied zwischen Referenz und Pointer nicht kennt sollte sich nicht Programmierer nennen dürfen egal welche Sprache und egal ob man es nun aktiv nutzt, wie in C, oder nur passiv wie in Java. Als Programmierer sollte man sich zumindest ein wenig mit der Architektur eines Computers beschäftigen und verstehen was unter der Hochsprache passiert.
klar, ich kann auch Auto fahren ohne zu wissen wie der Motor funktioniert aber für mich persönlich wäre das einfach ein Unding. Wenn mich etwas interessiert vertiefe ich auch mein Wissen alleine schon aus gesunder Neugierde.
 

mrBrown

Super-Moderator
Mitarbeiter
Wer den Unterschied zwischen Referenz und Pointer nicht kennt sollte sich nicht Programmierer nennen dürfen egal welche Sprache und egal ob man es nun aktiv nutzt, wie in C, oder nur passiv wie in Java. Als Programmierer sollte man sich zumindest ein wenig mit der Architektur eines Computers beschäftigen und verstehen was unter der Hochsprache passiert.
Was ist denn für dich der offensichtlich ja eindeutige und sprach-unabhängige Unterschied zwischen Referenz und Pointer?
 

mihe7

Top Contributor
Meine Sicht der Dinge: eine Referenz ist konzeptionell wesentlich weiter gefasst als ein Zeiger. Eine gültige Referenz ist ein abstrakter Bezeichner für ein Objekt, der es ermöglicht, das Objekt zu identifizieren. Die Kundennummer ist eine Referenz auf einen Kunden.

Am Rechner erhalten Objekte im Speicher ihre Identität in der Regel über ihre Speicheradresse. Dann stellt diese Adresse eine Referenz auf das Objekt dar. Eine Referenz ist mit dem Objekt verbunden, das sie refrenziert.

Variablen, die für eine Referenz stehen können oder, abhängig von der Programmiersprache, müssen, sind Referenzvariablen. Ein Zeiger hält dagegen eine beliebige Speicheradresse, die im Allgemeinen beliebig manipuliert werden kann. Ein Zeiger kann also selbst eine Referenz darstellen, ein Muss ist das allerdings nicht.
 

mrBrown

Super-Moderator
Mitarbeiter
Vom Konzept her, aus einer theoretischen Sicht, würde dir da sogar zustimmen, @mihe7.

Aber bei konkreten Umsetzungen in Programmiersprachen hilft einem das halt fast gar nicht weiter. Den Unterschied zwischen Referenzen und Pointern in C++ wird niemand, der nicht schon weiß was genau es in C++ ist, damit erklären können. Und ebenso wird niemand der Referenzen in Java kennt deshalb auch Referenzen in C++ verstehen, und andersrum.
 

mihe7

Top Contributor
Vom Konzept her, aus einer theoretischen Sicht, würde dir da sogar zustimmen, @mihe7.

Aber bei konkreten Umsetzungen in Programmiersprachen hilft einem das halt fast gar nicht weiter. Den Unterschied zwischen Referenzen und Pointern in C++ wird niemand, der nicht schon weiß was genau es in C++ ist, damit erklären können. Und ebenso wird niemand der Referenzen in Java kennt deshalb auch Referenzen in C++ verstehen, und andersrum.
Naja, Du hast in #27 nach dem sprach-unabhängigen Unterschied gefragt und das war der Versuch einer Beschreibung, in die sich die verschiedenen Ansätze unterschiedlicher Sprachen einfügen können.
 

Neue Themen


Oben