ich habe ein klasse
class foo {
public:
foo();
foo( int );
private:
static const string s;
};
Wo kann die Zeichenfolge s
in der Quelldatei am besten initialisiert werden?
c++
static
initialization
constants
Thomas
quelle
quelle
i
muss in der cpp definiert werden . §9.4.2 / 4 Wenn ein statisches Datenelement vom Typ const Integral oder const Enumeration ist, kann seine Deklaration in der Klassendefinition einen Konstanteninitialisierer angeben, der ein integraler konstanter Ausdruck sein soll (5.19). In diesem Fall kann das Element in ganzzahligen konstanten Ausdrücken erscheinen. Das Mitglied muss weiterhin in einem Namensraumbereich definiert sein, wenn es im Programm verwendet wird, und die Definition des Namespace-Bereichs darf keinen Initialisierer enthalten.i
müßte definiert werden wird nur , wenn es irgendwo anders verwendet als in integralem konstantem Ausdrücken, nicht wahr? In diesem Fall können Sie nicht sagen, dass ein Fehler vorliegt, da nicht genügend Kontext vorhanden ist, um sicherzugehen - oder genau genommen ist das obige Beispiel korrekt, wenn kein anderer Code vorhanden ist. Jetzt freue ich mich über Ihren Kommentar (+1), ich lerne immer noch selbst! Also werde ich versuchen, diesen Punkt in der Antwort zu klären, bitte lassen Sie mich wissen, ob es besser ist ...int f() { return 42; } class foo { static const int i = f(); /* Error! */ }
Beachten Sie, dass C ++ 11 das Aufrufen von 'constexpr'-Funktionen ermöglicht:constexpr int f() { return 42; } class foo { static const int i = f(); /* Ok */ }
Statische Mitglieder müssen in einer CPP-Übersetzungseinheit im Dateibereich oder im entsprechenden Namespace initialisiert werden:
quelle
In einer Übersetzungseinheit innerhalb desselben Namespace, normalerweise oben:
quelle
Seit C ++ 17 gilt der Inline- Bezeichner auch für Variablen. Sie können jetzt statische Elementvariablen in der Klassendefinition definieren:
quelle
static const int ARRAYSIZE
In der Header-Datei werden nur ganzzahlige Werte (z. B. ) initialisiert, da sie normalerweise im Klassen-Header verwendet werden, um beispielsweise die Größe eines Arrays zu definieren. Nicht ganzzahlige Werte werden in der Implementierungsdatei initialisiert.quelle