structs initialisieren
-
Hoi,
offenbar kann man nen struct ja so initialisieren:
struct foo { int i; double d; }; foo f = {2, 3.3};Aber folgendes raffe ich jetzt nicht: Ich hab ne Struktur D3DXFONT_DESC, die sieht so aus:
struct D3DXFONT { INT Height; UINT Width; UINT Weight; UINT MipLevels; BOOL Italic; BYTE CharSet; BYTE OutputPrecision; BYTE Quality; BYTE PitchAndFamily; CHAR FaceName[LF_FACESIZE]; };Logischerweise geht das jetzt nicht:
D3DXFONT_DESC d; d.FaceName = "foo";Aber wieso bitte geht dann DAS hier:
D3DXFONT_DESC fontDesc = { fontHeight, 0, static_cast<unsigned int>(fontWeight * 1000), 0, italic, DEFAULT_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_PITCH, "foo" };Die Werte in den Klammern { } werden doch einfach 1:1 den Werten der Struktur zugewiesen. Wieso geht dann die Zuweisung von "foo" an FaceName nicht schief?
-
strukteur schrieb:
Wieso geht dann die Zuweisung von "foo" an FaceName nicht schief?
Weil es keine Zuweisung ist.
-
Was dann?
-
strukteur schrieb:
Was dann?
Ich glaube es ist eine Initialisierung im Sinne eines Konstruktors. Folgendes geht ja auch:
char foo[4] = "foo";
-
strukteur schrieb:
Was dann?
Eine Initialisierung.
T x = a;ist eine Initialisierung (und eine Definition).
x = a;ist eine Zuweisung. Initialisierung bei Aggregaten (wie hier) zerfällt in die Initialisierung der einzelnen Elemente. Dort gilt aber weiterhin die gleiche Semantik:
char x[5] = "foo"; // ok, oder char x[5] = { "foo" }; // aber nicht: x = "foo"; // arrays kann nicht zugewiesen werden (x ist hier trotzdem ein lvalue ;) ) struct Y { char x[5]; }; Y y = { "foo" }; // ok, oder Y y = { { "foo" } }; // aber nicht: y.x = "foo"; // arrays kann nicht zugewiesen werden
-
Davon mal abgesehen das auch structs Konstruktoren haben können und man (ok in dem Beispiel nicht ideal) auch nen bissel Tipparbeit nachher sparen kann
