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

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

1

20.06.2013, 19:48

[C++] Verschiedene Syntac von Konstruktoren

Hi Leute,

ich habe ein wenig die TriBase engine durchstöbert, und bin dabei auf folgendes Code Beispiel gestoßen:

C-/C++-Quelltext

1
    tbVector3(const tbVector3& v) : x(v.x), y(v.y), z(v.z)      {}

ich habe noch nie so eine Syntax gesehen.
Ich würde sowas so schreiben:

C-/C++-Quelltext

1
2
3
4
5
6
tbVector3(const tbVector3& v) 
{
       x=v.x;
       y=v.y;
       z=v.z;
}


was genau macht dieser ":" dort? und warum kann man einfach mit x(WERT), x einen wert zufügen?
Was ist besser, die Schreibweise von David oder die von mir?

//EDIT: Oh sorry, wollte eigentlich ein neues Thema auf machen :O
kann das jemand verschieben in ein neues Thema, muss mich wohl verklickt haben.
Sorry
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

2

20.06.2013, 19:54

Das ist eine Initialisierungsliste in c++, es wird benötigt um Konstruktoren zu ermöglichen die parameter entgegennehmen und in einer ableitungshierarchie stehen.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

3

20.06.2013, 21:19

Mit Ableitung hat das eigentlich erst mal wenig zu tun. Die Initialisierungsliste wird ausgeführt bevor der eigentliche Code vom Konstruktor ausgeführt wird. Es wird bei der Initialisierung eines Objektes aufgerufen. Das kann einige Vorteile haben. Wenn du zum Beispiel eine Klasse ohne Standard-Konstruktor hast und diese als Member einer anderen Klasse haben möchtest, so kannst du sie in der Liste initialisieren und dieser Klasse die benötigten Parameter mitgeben. Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class KlasseA // Eine Klasse ohne Standardkonstruktor
{
public:
    KlasseA(int irgendeinWert){// Was hier passiert ist unwichtig}
};

class KlasseB // Eine Klasse mit KlasseA als Member
{
private:
    KlasseA klasseA; // hier ist eine Instanz vom Typ KlasseA. KlasseA hat keinen Standardkonstruktor und kann nicht ohne Parameter initialisiert werden.

public:
    KlasseB():klasseA(KlasseA(42)) // Durch die Initialisierungsliste kannst du nun den Konstruktor von KlasseB aufrufen. Ansonsten würde es zum Fehler kommen.
    {
        // Hier muss klasseA schon initialisiert sein.
    }
};
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

20.06.2013, 21:36

Was ist besser, die Schreibweise von David oder die von mir?
Die von David.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

20.06.2013, 22:42

Es handelt sich da nicht einfach nur um zwei verschiedene Schreibweisen, sondern um zwei fundamendal verschiedene Dinge.

C-/C++-Quelltext

1
    tbVector3(const tbVector3& v) : x(v.x), y(v.y), z(v.z)      {}


Hier werden die Member x, y und z direkt mit den Werten v.x, v.y und v.z initialisiert.

C-/C++-Quelltext

1
2
3
4
5
6
tbVector3(const tbVector3& v) 
{
       x=v.x;
       y=v.y;
       z=v.z;
}


Hier dagegen, werden die Member x, y und z erst einmal default initialized (da keine explizite Initialisierung für die Member angegeben wurde). Nachdem alle Member initialisiert wurden, werden x, y und z dann im Body des Konstrukturs die Werte v.x, v.y und v.z zugewiesen.

Beide Varianten drücken also zwei völlig verschiedene Dinge aus. Lediglich in diesem konkreten Beispiel mit dem tbVector3 wird am Ende der gleiche Maschinencode rauskommen, da die Member x, y und z nur einfache floats sind und default initialization eines float einfach nur keiner Initialisierung entspricht. Wären x, y und z allerdings keine Objekten primitiven Typs, dann würde sich die unterschiedliche Bedeutung des Geschriebenen sehr schnell bemerkbar machen, denn dann würden in deiner Variante erst einmal die Default-Konstruktoren von x, y und z aufgerufen und danach den bereits konstruierten Objekten neue Werte zugewiesen. Wenn für den Typ von x, y und z kein Default Konstruktor oder Zuweisungsoperator definiert ist, würde Variante zwei gar nicht erst kompilieren. Selbst wenn, gäbe es potentiell einen unnötigen Konstruktoraufruf im Vergleich zu Variante eins mit der Initialisierungsliste, in der x, y und z einfach direkt mit den entsprechenden Werten konstruiert werden und fertig.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

6

20.06.2013, 22:51

Rein syntaktisch könnte man das anders schreiben:

C-/C++-Quelltext

1
2
3
4
5
tbVector3(const tbVector3& v)
: x(v.x)
, y(v.y)
, z(v.z)
{}

Oder etwas ähnliches wirft oftmals gemacht.

xXSlayerXx

Treue Seele

  • »xXSlayerXx« ist der Autor dieses Themas

Beiträge: 111

Beruf: Technischer Produktdesigner

  • Private Nachricht senden

7

21.06.2013, 15:18

ok super,

jetzt verstehe ich den unterschied.
Bin euch sehr dankbar :)
Bestes Zitat aus einem Quellcode :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
/** 
Once you are done trying to ‘optimize’ this routine, 
and have realized what a terrible mistake that was, 
please increment the following counter as a warning 
to the next guy: 

total_hours_wasted_here = 11 
*/

Werbeanzeige