Warum ist es nicht in C++ erlaubt?
Bis und wenn Sie es nicht definieren, wird die Variable kein l-Wert.
Warum dürfen konstante Mitglieder initialisiert werden?
Auch in diesem Fall ist eine Definition erforderlich, wenn Sie die Adresse der Variablen übernehmen wollen.
9.4.2 statische Datenelemente
Die Deklaration eines statischen Daten Element in seiner Klassendefinition nicht eine Definition ist, und eines unvollständigen anderen Typ als cv sein kann, -qualifizierte Leere Die Definition für eines statischen Datenelements muss in einem Namensraumbereich mit der Klassendefinition des Elements angezeigt werden. In der Definition unter Namensraumbereich muss der Name des statischen Datenelements über seinen Klassennamen mit dem Operator :: qualifiziert werden. Der Initialisierer Ausdruck in der Definition eines statischen Daten Mitglied im Rahmen seiner Klasse
Auch dies ist in erster Linie eine Nutzung Artefakt, so dass Sie schreiben können:
class S {
static const int size = 42;
float array[ size ];
};
Does diese mittleren statischen Variablen in C++ werden nicht mit 0 als in C initialisiert?
Nein sie sind:
3.6.2 Initialisierung nicht lokaler Variablen
Variables mit statischer Speicherdauer (3.7.1) oder Fadenspeicherdauer (3.7. 2) muss auf Null initialisiert werden (8.5) bevor irgendeine andere Initialisierung Platz findet.
Obwohl die Dinge in C++ 0x etwas komplizierter werden. Alle Literaltypen können nun initialisiert werden (im Gegensatz zu nur ganzzahligen Typen im aktuellen Standard), was bedeutet, dass alle Skalartypen (einschließlich Gleitkommazahlen) und einige Klassentypen jetzt mithilfe eines Initialisierers in der Deklaration initialisiert werden können.
Danke für die tolle Antwort, Sie haben mich davon abgehalten, mein Gehör aus meinem Kopf zu ziehen! Ich habe aber eine Frage, gibt es eine Möglichkeit, einen Nullzeiger beim Definieren von Referenzmembern zu liefern? –
@TimVisee Nicht sicher, ob es möglich ist - zumindest in einer tragbaren, nicht UB-Weise - aber Sie würden mit einer ungültigen Referenz enden. Wenn Sie NULL Semantik wollen, verwenden Sie einfach einen Zeiger oder vielleicht etwas wie Boost Optional. –