Operatoren und Felder

Sheggo

Grünschnabel
Hi zusammen,
bin neu hier und auch Anfänger in C/C++ und hab da gleich mal nen Problem:

Im main Programm sollen u.a. folgende Zeilen stehen (hab mir das nicht ausgedacht, ist so vorgegeben):
.....
[01] Vfeld f1(4); // Dadurch wird ne Funktion aufgerufen und ein Feld mit länge=4 angelegt und anschließend vier Nullen hineingeschrieben, das funktioniert auch
[02] Vfeld f2 = f1; // Hier soll halt ein neues Feld angelegt werden und der Inhalt gleich dem f1 sein
.....

dazu gibt es in der Musterlösung folgendes:

[03] Vfeld & Vfeld::operator =(const Vfeld &b) :confused:
{....}
und genau da liegt mein Problem! Erstens wird durch Zeile [02] dieser Konstruktor [03] garnicht aufgerufen (sondern es wird anscheinend der Zeiger auf f2 gleich dem Zeiger von f1 gesetzt, und dadurch hat man ja 2 Zeiger auf das selbe Feld und nicht 2 Felder, denn wenn ich im nachhinein f2 ändere, ändert sich auch f1) und zweitens kann ich mit dem Konstruktoraufbau nicht allzuviel anfangen. Hoffe das kann mir mal jmd erklären.

Ich hoffe mal, dass ihr überhaupt versteht, was ich von euch will ;)
Also danke schonmal für die Antworten

Sheggo
 
Hi.
Hi zusammen,
bin neu hier und auch Anfänger in C/C++ und hab da gleich mal nen Problem:

Im main Programm sollen u.a. folgende Zeilen stehen (hab mir das nicht ausgedacht, ist so vorgegeben):
.....
[01] Vfeld f1(4); // Dadurch wird ne Funktion aufgerufen und ein Feld mit länge=4 angelegt und anschließend vier Nullen hineingeschrieben, das funktioniert auch
[02] Vfeld f2 = f1; // Hier soll halt ein neues Feld angelegt werden und der Inhalt gleich dem f1 sein
.....

dazu gibt es in der Musterlösung folgendes:

[03] Vfeld & Vfeld::operator =(const Vfeld &b) :confused:
{....}
und genau da liegt mein Problem! Erstens wird durch Zeile [02] dieser Konstruktor [03]
Das ist kein Konstruktor. Es ist der Zuweisungsoperator. Und der wird tatsächlich bei der Initialisierung eines Objekts durch ein anderes Objekt nicht aufgerufen. Bei [02] wird der Kopierkonstruktor aufgerufen, der sieht folgendermassen aus:
C++:
Vfeld(const Vfeld& other) {
   ...
}
garnicht aufgerufen (sondern es wird anscheinend der Zeiger auf f2 gleich dem Zeiger von f1 gesetzt, und dadurch hat man ja 2 Zeiger auf das selbe Feld und nicht 2 Felder, denn wenn ich im nachhinein f2 ändere, ändert sich auch f1) und zweitens kann ich mit dem Konstruktoraufbau nicht allzuviel anfangen. Hoffe das kann mir mal jmd erklären.
Falls du keinen Kopierkonstruktor für die Klasse definiert hast, generiert der Kompiler einen Standard-Kopierkonstruktor - der dann tatsächlich nur alle Attribute der Klasse vom Wert her kopiert.

Du kannst aber deinen Zuweisungoperator folgendermassen aufrufen:
C++:
Vfeld f2;
f2 = f1; // Zuweisungsoperator-Aufruf

Den Kopierkonstruktor solltest du aber auf jeden Fall auch definieren.

Gruß
 
ahhja das erklärt einiges :)

vielen Dank für die schnelle und präzise Antwort !

Ich tu mich echt noch schwer mit der Ausdrucksweise und Bezeichnung einiger Elemente, irgendnen Tipp, wo man sowas gescheit nachlesen kann? (außer MSDN ^^)
 
Hi.

Am besten besorgst du dir ein Buch.

Mit den Klassikern kann man eigentlich nichts falsch machen:

  1. Stroustrup, Bjarne: Die C++ Programmiersprache
  2. Myers, Scott: Effektiv C++ programmieren und Mehr effektiv C++ programmieren

Gruß
 
Hab da nochmal ne Frage:

Vfeld & Vfeld::operator =(const Vfeld &b)

Mir ist nicht ganz klar wofür das erste "&" da ist. Bedeutet doch, dass ich eine Adresse als Rückgabewert habe oder!?
Das macht doch keinen Sinn, wenn ich return *this zurückgebe?!

Irgendwie schwierig wenn der Prof seinen Quellcode nicht kommentiert :rolleyes:
Zumindest geht es mit und ohne &
 
Hallo,
das und sagt dir das du dir eine Referenz von dem Objekt holst, du musst dein Objekt ja irgendwie an die Funktion übergeben ;)

C++:
F               // Vfeld & 
 =              // Vfeld::operator =
F2;            // (const Vfeld &b)

// const deswegen, damit sichergestellt das du das Objekt,
// wessen Werte du zuweisen willst nicht verändert wird.

so kannst du dir das Vorstellen ;)

Edit:
Ich lerne C++ mit "C++ Primer 4th Edition" - kann ich nur empfehlen!

Grüße, random.
 
Hi.

Ich versuch's nochmal etwas anders zu erklären.
Vfeld & Vfeld::operator =(const Vfeld &b)

Mir ist nicht ganz klar wofür das erste "&" da ist. Bedeutet doch, dass ich eine Adresse als Rückgabewert habe oder!?
Im Grunde wird dann dort (implizit) eine Adresse übergeben, ja. Aber es ist kein Zeiger! Insbesondere kann also das was dort übergeben wird nicht 0 (Nullzeiger) sein.
Das macht doch keinen Sinn, wenn ich return *this zurückgebe?!
Warum nicht? ;) Du vergisst das der Rückgabewert eines Operators noch verwendet werden könnte...

Nehmen wir an, die Klasse Vfeld besitzt die Methode setzeWerte(int index, int value). Diese Methode verändert also den Wert des Feldes an der Position index auf den Wert value.
C++:
Vfeld f1(3), f2;

( f2 = f1 ).setzeWert(1, 55);
Was wäre nun, wenn wir keine Referenz auf (*this) im operator= zurückgeben würden?

Das bedeutet, es würde eine Kopie des Objekts f2 zurückgegeben werden (Kopierkonstruktor würde aufgerufen!) und diese Kopie würde verändert werden. D.h. f2 wäre dann zwar eine Kopie von f1, aber der Wert an der Stelle 1 wäre immernoch unverändert.

Probier's einfach mal aus!

Gruß
 
Hallo,
das und sagt dir das du dir eine Referenz von dem Objekt holst, du musst dein Objekt ja irgendwie an die Funktion übergeben ;)

C++:
F               // Vfeld & 
 =              // Vfeld::operator =
F2;            // (const Vfeld &b)

// const deswegen, damit sichergestellt das du das Objekt,
// wessen Werte du zuweisen willst nicht verändert wird.

so kannst du dir das Vorstellen ;)
Ganz so ist es nicht. Eher so
C++:
F // Adresse von F wird als this Zeiger an die Methode übergeben
=      // aufgerufener Operator => gibt eine Referenz des Objekts zurück
F2;   // wird als const Vfeld& übergeben
const deswegen, damit auch tempoäre Objekte übergeben werden können.

Der Rückgabewert wird hierbei gar nicht verwendet, so das es auch egal ist was man hier zurückgibt.

Gruß
 
Zuletzt bearbeitet:
Zurück