Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Da_CH

Frischling

  • »Da_CH« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Irgendwo in der schönen Schweiz ;)

  • Private Nachricht senden

1

28.07.2011, 22:17

Konstruktor direkt aufrufen?

Hallo zusammen

Ich habe eine kleine Frage bezüglich Konstruktoren. Die Funktionen (bzw. die überladenen Operatoren) der Vekotrklasse tbVecotr3 in David Scherfgens Buch 3D-Spieleprogrammierung verwenden oftmals:

C-/C++-Quelltext

1
 return tbVector3 (x, y, z);


Dies bedeutet ja, dass der Konstruktor der Vektorklasse aufgerufen wird und dabei eine Instanz der Klasse entsteht, welche ihre Werte an die (Funktion-)aufrufende Instanz übergibt. Mich würde nun interessieren was hier genau passiert. Kann man einen Konstruktor direkt aufrufen? Ich dachte, dass geschieht nur wenn ein Objekt der Klasse erzeugt wird. Irgendwie sieht es hier jedoch aus, als würde der Konstruktor gar kein Objekt erzeugen. Ich hab in einer kleinen Konsolenanwendung auch folgendes versucht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
 int main () 
{ 

MyClass::MyClass(1, 2, 3); // Der Konstruktor wird aufgerufen, anschliessend aber auch gleich der Destruktor 

MyClass AnyObject; // Aufruf mit Standard-Konstruktor 

AnyObject = MyClass::MyClass (4, 5, 6); // Die drei int-Variablen der AnyObject-Instanz erhalten die Werte 4, 5, 6 

}; 


Wieso funktioniert das? Vermutlich ist die Antwort ganz einfach, aber irgendwie stehe ich gerade total auf dem Schlauch :S

Vielen Dank schonmal im Voraus.

Gruss Da_CH

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

28.07.2011, 22:33

C-/C++-Quelltext

1
tbVector3 (x, y, z)

erstellt ein temporäres Objekt. Ein temporäres Objekt hat keinen Namen und lebt (mal von Ausnahmefällen abgesehen) nur für die Dauer der Auswertung des Ausdrucks in dem es vorkommt (also vereinfacht gesagt "bis zum ;").

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

3

29.07.2011, 15:24

Du kannst ja auch Objekte auf dem Stack haben, diese werden dann nicht per new auf dem Heap abgelegt.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

Da_CH

Frischling

  • »Da_CH« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Irgendwo in der schönen Schweiz ;)

  • Private Nachricht senden

4

30.07.2011, 01:11

Hallo zusammen, vielen Dank für eure Antworten. Heisst das nun also, dass ein temporäres Objekt auf dem Stack erzeugt wird, welches bspw. nach einer Zuweisung an ein bestehendes Objeket gleich wieder gelöscht wird?

Gruss Da_CH

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

30.07.2011, 09:41

Ganz genau. Allerdings wird der Compiler temporäre Objekte nach Möglichkeit wegoptimieren. Im konkreten Fall dürfte z.B. die Return Value Optimization greifen.

Noch mehr zu Thema z.B. hier.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (30.07.2011, 09:46)


Da_CH

Frischling

  • »Da_CH« ist der Autor dieses Themas

Beiträge: 3

Wohnort: Irgendwo in der schönen Schweiz ;)

  • Private Nachricht senden

6

05.08.2011, 22:12

Super, dann ist alles klar. Vielen Dank für die Links und deine Hilfe!

P.S.: 'schuldigung dass ich mich erst jetzt gemeldet und bedankt habe ^^

Gruss Da_CH

Werbeanzeige