Was sind speziell in C ++ die semantischen Unterschiede zwischen zum Beispiel:
static const int x = 0 ;
und
const int x = 0 ;
sowohl static
als Verknüpfungs- als auch als Speicherklassenspezifizierer (dh innerhalb und außerhalb einer Funktion).
static
ist wahrscheinlich das am meisten überladene Schlüsselwort in C ++. Die Bedeutung Ihres Codes variiert stark, je nachdem, ob er sich im Namespace-Bereich, im Klassenbereich oder im Funktionsbereich befindet. Vielleicht möchten Sie das klarstellen.::
ohne Bezeichner zugänglich ). Mir sind keine bedeutenden Unterschiede zwischen dem globalen Namespace und einem darin verschachtelten Namespace bekannt. Es gibt sicherlich keine in Bezug aufstatic
Objekte.Antworten:
Im Dateibereich kein Unterschied in C ++.
const
macht die interne Verknüpfung zum Standard und alle globalen Variablen haben eine statische Lebensdauer. Die erste Variante hat jedoch das gleiche Verhalten in C, so dass dies ein guter Grund sein kann, es zu verwenden.Innerhalb einer Funktion kann die zweite Version aus Parametern berechnet werden. In C oder C ++ muss es keine Kompilierungszeitkonstante sein, wie es einige andere Sprachen erfordern.
Innerhalb einer Klasse im Grunde das Gleiche wie für Funktionen. Ein Instanzwert
const
kann in der ctor-initializer-Liste berechnet werden . Astatic const
wird während der Startinitialisierung gesetzt und bleibt für den Rest des Programms unverändert. (Hinweis: Der Code fürstatic
Mitglieder sieht etwas anders aus, da Deklaration und Initialisierung getrennt sind.)Denken Sie daran, in C ++,
const
Mittel schreibgeschützt , nicht konstant . Wenn Sie einen Zeiger auf haben, könnenconst
andere Teile des Programms den Wert ändern, während Sie nicht suchen. Wenn die Variable mit definiert wurdeconst
, kann niemand sie nach der Initialisierung ändern, aber die Initialisierung kann immer noch beliebig komplex sein.quelle
const
gilt für eine Ansicht der Variablen und nicht für die Variable selbst, dass eine andere Personconst
dieselbe Variable nicht anzeigen kann, und der Compiler ist ziemlich still, wenn er sie ändert.const
, aber die neueconstexpr
kann stattdessen verwendet werden (und auch in anderen Szenarien). Tatsächlich erweitert der C ++ 0x-Standard die Verwendungconst
in diesem Szenario auch auf nicht integrale "Literaltypen". Ich denke, ich würde es vorziehen,constexpr
für diese Fälle zu verwenden, da Sie die Abwärtskompatibilität mit Pre-C ++ 0x-Compilern sowieso brechen würden.C ++ 17-Standardentwurf
const
impliziert denstatic
DateibereichDies ist das Zitat für das, was unter https://stackoverflow.com/a/3709257/895245 erwähnt wurde
C ++ 17 n4659 Standardentwurf 6.5 "Programm und Verknüpfung":
Anhang C (informativ) Kompatibilität, C.1.2 Abschnitt 6: "Grundbegriffe" gibt die Begründung, warum dies von C geändert wurde:
Siehe auch: Warum impliziert const eine interne Verknüpfung in C ++, wenn dies in C nicht der Fall ist?
Was Sie wahrscheinlich stattdessen für Header tun möchten
Ausführlich erklärt unter: Was bedeutet 'const static' in C und C ++?
extern
im Header Definition in der CPP-Dateiquelle