Die einzige sinnvolle Sache, die Sie mit einem C-Array in C ++ 03 machen können, ist value-initialize (in C ++ 11 und darüber hinaus kann es list-initialisiert werden).
Aus dem Standard C ++ 03, §8.5 / 7:
Ein Objekt, dessen Initialisierer ein leerer Satz von Klammern ist, d. h., (,), wird mit Wert initialisiert.
Und aus §8.5 / 5:
Um value-initialize bedeutet ein Objekt vom Typ
T
:
- Wenn
T
ein Klassentyp mit einem deklarierten Konstruktor ist, dann wird der Standardkonstruktor fürT
aufgerufen (und die Initialisierung ist fehlerhaft, wennT
keinen zugreifbaren Standardkonstruktor hat);- Wenn
T
ein Nicht-Union-Klassentyp ohne einen von einem Benutzer deklarierten Konstruktor ist, wird jeder nicht statische Datenmember und die Basisklassenkomponente vonT
value-initialisiert;- Wenn
T
ein Array-Typ ist, wird jedes Element initialisiert;- Andernfalls wird das Objekt initialisiert
Um Nullinitialisierung bedeutet ein Objekt vom Typ
T
:
- Wenn
T
ein Skalartyp ist, wird das Objekt auf den Wert von0
(null) gesetzt, konvertiert inT
;- Wenn
T
ein Nicht-Union-Klassentyp ist, wird jedes nicht statische Datenelement und jedes Basisklassen-Unterobjekt auf Null initialisiert;- wenn
T
ein Union-Typ ist, das erste benannte Datenelement des Objekts, ist null-initialisiert;- Wenn
T
ein Array-Typ ist, wird jedes Element auf Null initialisiert;- Wenn
T
ein Referenztyp ist, wird keine Initialisierung durchgeführt.
Wenn Ihre Konstruktordefinition in
geändert wird %Vor% Dann ist garantiert, dass nach der Konstruktion alle 5 Elemente von A::a
den Wert '
und %code% Null haben werden. A::ptr
'
Angst nicht; C ++ unterstützt die Initialisierung solcher Arrays nicht.
Sie müssen nur seinen Mitgliedern im Konstruktorhauptteil von A
zuweisen, oder Sie können value-initialization verwenden, wenn es Ihnen nicht wirklich wichtig ist, was die Werte sind:
C ++ 0x lässt Sie jedoch alle Werte angeben:
%Vor% Beachten Sie jedoch, dass, weil Arrays nicht class-object
s sind, dies nicht möglich ist:
Tags und Links c++ constructor