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

1

04.03.2014, 17:14

Frage zur Initialisierungsliste

Hallo Forum,

ich lese momentan das Buch "Der C++ Programmierer" in der neuesten Auflage. Allerdings habe ich da ein kleines Verständnisproblem.

Ich zitiere einfach mal zwei Zeilen aus dem Buch:

C-/C++-Quelltext

1
2
3
BeschriftetesObjekt(const Ort& ort, const std::string& b)
: GraphObj(ort), beschriftung {b} {
}


Was da passiert ist mir im Grunde klar, allerdings verstehe ich nicht so recht warum einmal eine runde Klammer und einmal eine geschweifte Klammer verwendet wird, bzw. was dabei genau der Unterschied ist. Davor wurde im Buch eigentlich auch immer eine geschweifte Klammer verwendet (ich meine jetzt auch nur die Initialisierungsliste, nicht den Funktionsrumpf). Wenn ich im Netz rumsuche finde ich allerdings auch nur Beispiele mit runden Klammern.

Würde mich freuen, wenn mich da jemand mal etwas aufklären könnte :D

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

04.03.2014, 17:35

Dabei handelt es sich um ein mit C++11 eingeführtes, relativ neues Feature (http://en.wikipedia.org/wiki/C++11#Uniform_initialization); ältere Compiler würden diesen Code gar nicht kompilieren (vor C++11 gab es nur die Variante mit den runden Klammern).

Es gibt ein paar ganz feine Unterschiede, beispielsweise was sog. narrowing Conversions betrifft (einen Member int x; könntest du zwar mit x(0.0f) initialisieren, x{0.0f} würde aber zu einem Compilerfehler führen, da 0.0f vom Typ float ist und die implizite Konvertierung von float nach int potentiell mit einem Präzisionsverlust behaftet ist; sowohl x(0) als auch x{0} funktionieren aber, da 0 vom passenden Typ int ist), aber im Prinzip tun beide Varianten das gleiche.

3

04.03.2014, 19:18

Danke für die Antwort. Also wie ich das jetzt verstehe wäre es ratsam generell geschweifte Klammern zu nutzen um etwaige Fehler zu vermeiden, wenn man den falschen Datentypen übergibt. Was sich mir da jetzt noch nicht ganz erschließt ist, warum in dem Beispielcode bei dem anderen Member (GraphObj) dann die runde Klammer gewählt wird. Gibt es explizite Fälle in denen man die "alte" Variante nutzen sollte?

Werbeanzeige