Forum: PC-Programmierung C++ Überladungen


von D43C (Gast)


Lesenswert?

Guten Tag,

gerade lese ich mich durch ein C++ Skript und bin bei den Überladungen 
angelangt. Leider ist das Skript nur sehr bescheiden ausgeführt und mehr 
eine Sammlung von Präsentationsfolien.
Vielleicht könnt ihr mir ja weiterhelfen.
Es geh um folgendes :

Ich möchte gerne in C++ die Operatoren  + sowie  << und >> für cout und 
cin überladen.
Aus dem Skript habe ich folgendes gelernt :

friend ErgebnisTyp operator + ( Parameter )

Bei mir wäre das dann

friend RationaleZahl & operator + (RationaleZahl &r1 , RationaleZahl 
&r2)

Ich habe es bisher immer so gemacht, dass ich bei den Parametern und 
beim Ergebnisstyp ein & dazugeschrieben habe.
In späteren Kapiteln des Skripts wird aber oftmals das & weggelassen.

Ist es richtig, dass ich es für den Zugriff auf private Attribute 
benötige ?
Und ist es falsch, wenn ich es immer hinschreibe ?

Im Skript habe ich zum Beispiel folgendes Beispiel :

friend RationaleZahl operator + (RationaleZahl , RationaleZahl)

und

friend ostream & operator << (ostream &os , RationaleZahl r)

Darf ich das Ganze auch immer so schreiben :

friend RationaleZahl & operator + (RationaleZahl &r1 , RationaleZahl 
&r2)

und

friend ostream & operator << (ostream &os , RationaleZahl &r)   oder 
wäre das in bestimmten Fällen falsch ?

von Fritz (Gast)


Lesenswert?

D43C schrieb:
> Ist es richtig, dass ich es für den Zugriff auf private Attribute
> benötige ?

Nein.

> Und ist es falsch, wenn ich es immer hinschreibe ?

Du solltest vor den Überladungen erstmal lernen, was Referenzen sind 
(die Dinger mit &), warum man sie einsetzt, und wann sie sinnvoll sind.

Das können die drei Zeilen in einem Webforum nicht abnehmen.

Also ---> Buch.

von Rolf Magnus (Gast)


Lesenswert?

D43C schrieb:
> Ich habe es bisher immer so gemacht, dass ich bei den Parametern und
> beim Ergebnisstyp ein & dazugeschrieben habe.
> In späteren Kapiteln des Skripts wird aber oftmals das & weggelassen.
>
> Ist es richtig, dass ich es für den Zugriff auf private Attribute
> benötige ?

Nein.

> Und ist es falsch, wenn ich es immer hinschreibe ?

Ja.

> Darf ich das Ganze auch immer so schreiben :
>
> friend RationaleZahl & operator + (RationaleZahl &r1 , RationaleZahl
> &r2)
>
> und
>
> friend ostream & operator << (ostream &os , RationaleZahl &r)   oder
> wäre das in bestimmten Fällen falsch ?

Es wäre falsch.

von A. H. (ah8)


Lesenswert?

Schau Dir doch mal im C++ Compiler Deiner Wahl die Implementierung der 
Klasse <complex> an. Auf Unix Systemen findest Du die normalerweise 
irgendwo unter /usr/include/c++. Dort kannst Du Dir viel abschauen 
hinsichtlich dessen, wie man so etwas implementiert. Auch boost.org hat 
meines Wissens bereits Bibliothek für rationale Zahlen. Selbst wenn Du 
die aus welchen Gründen auch immer nicht verwenden willst, als Vorlage 
ist sie sicherlich nicht verkehrt.

In diesem Fall wirst Du mit ziemlicher Sicherheit die kanonische Form 
wollen, d.h. Du implementierst ein += Operator, der als member-Fumktion 
Zugriff auf alle privaten Daten hat und die eigentliche Arbeit erledigt. 
Der (oder besser die) + Operatoren werden dann mit dessen Hilfe 
implementiert.
1
inline RationaleZahl operator+(const RationaleZahl& x, const RationaleZahl& y) {
2
  RationaleZahl tmp = x;
3
  tmp += y;
4
  return tmp;
5
}

Achte auf const& für die Parameter und als return-Typ wirst Du einen 
value-Typ wollen. Mehrere Operatoren bieten sich an, um auch Operationen 
mit dem Basistyp Deiner Klasse zuzulassen. z.B:
1
inline RationaleZahl operator+(const RationaleZahl& x, int y) {
2
  RationaleZahl tmp = x;
3
  tmp += RationaleZahl(y); // sofern kein RationaleZahl& operator+=(int) existiert
4
  return tmp;
5
}

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

D43C schrieb:
> gerade lese ich mich durch ein C++ Skript

Wenn das Skript solche Fragen aufkommen lässt, dann sind dringend 
folgende 4 Aktionen auszuführen:

1) Mülleimer auf

2) Skript rein

3) Mülleimer zu

4) Gutes C++ Buch besorgen

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.