[C++] Überladen von Zuweisungsoperator ruft Destruktor auf?

Skid

Erfahrenes Mitglied
Hallo,

ich habe eine Frage fürs Verständnis, da mir folgende Charakteristik wenig einleuchtend erscheint:

Ich habe einen Zuweisungsoperator überladen, der von einem übergebenen Feld Werte an ein Feld in einer Klasse übergibt, also ungefähr so:
Code:
myMatrix myMatrix::operator = (const float pMatrix[][4])
{
	for(int tJ = 0; tJ <= 3; tJ++)
		for(int tI = 0; tI <= 3; tI++)
			mMatrix[tJ][tI]	= pMatrix[tJ][tI];

	return *this;
}

So also werden die Werte eines Feldes kopiert und in einem anderen Feld gespeichert.
Wenn ich nun folgenden Code ausführe ...
Code:
float m[4][4];
for(int i = 0; i < 4; i++)
	for(int j = 0; j < 4; j++)
		m[i][j]		= i + j;

myMatrix tMatrix;
tMatrix = m;   // Aufruf des Dekonstruktor

... wird nach diesem Code der Dekonstruktor aufgerufen, mir ist nur nicht ganz klar warum?
Kann mich jemand darüber aufklären?

Vielen Dank,
SKiD.
 
Der Destruktor wird aufgerufen, weil du ein Objekt zurückgibst. Bei return *this gibst du ein Objekt zurück (Zeiger wird dereferenziert). Es handelt sich dabei nur um ein temporäres Objekt, für das im main() zuerst der Konstruktor aufgerufen wird. Es wird allerdings nicht benötigt und deshalb wird gleich darauf der Destruktor für dieses Objekt aufgerufen.

Lg
 
Okay, klingt plausibel. Danke für die Antworten!
Durch die Rückgabe einer Referenz, bleiben meine eigentlichen Werte bestehen, beziehungsweise mein Objekt, weswegen der Dekonstruktor nicht aufgerufen wird.

Stellt sich die Frage, warum der Konstruktor aufgerufen wird, wenn ich keine Referenz zurückgebe? Das mit dem Dekonstruktor ist mir klar, eben wegen der Refernz, aber warum wird vor dem Aufruf ...
Code:
tMatrix = m;
... der Konstruktor aufgerufen?
 
Stellt sich die Frage, warum der Konstruktor aufgerufen wird, wenn ich keine Referenz zurückgebe? Das mit dem Dekonstruktor ist mir klar, eben wegen der Refernz, aber warum wird vor dem Aufruf ...
Code:
tMatrix = m;
... der Konstruktor aufgerufen?
In vorhergehenden Zeile legst du eine Instanz von myMatrix an, was einen Aufruf des Default-Konstruktors bewirkt.

Grüße,
Matthias
 
Ach so, dass war gemeint. Ja okay, da stand ich jetzt wohl etwas auf dem Schlauch. Ich dachte, dass der Konstruktor genau an der Stelle...
Code:
tMatrix = m;
... vor dem überladenen Zuweisungsoperator aufgerufen wird. Also ein zweites mal, nach dem Erstellen des Objekts.

Danke nochmal, Problem ist gelöst! :)
 
Zurück