Das Schlüsselwort static
hat in C ++ mehrere Bedeutungen, die ich sehr verwirrend finde, und ich kann mich nie darüber Gedanken machen, wie es eigentlich funktionieren soll.
Soweit ich static
weiß , gibt es eine Speicherdauer, was bedeutet, dass sie im Falle eines globalen Programms für die gesamte Lebensdauer des Programms gültig ist. Wenn Sie jedoch von einem lokalen Programm sprechen, bedeutet dies, dass es standardmäßig auf Null initialisiert ist.
Der C ++ - Standard sagt dies für Klassendatenelemente mit dem Schlüsselwort static
:
3.7.1 Statische Speicherdauer [basic.stc.static]
3 Mit dem Schlüsselwort static kann eine lokale Variable mit statischer Speicherdauer deklariert werden.
4 Das Schlüsselwort static, das in einer Klassendefinition auf ein Klassendatenelement angewendet wird, gibt die statische Speicherdauer des Datenelements an.
Was bedeutet das mit lokaler Variable ? Ist das eine lokale Funktionsvariable? Denn wenn Sie eine lokale Funktion deklarieren static
, wird sie nur einmal initialisiert, wenn sie diese Funktion zum ersten Mal aufruft.
Es wird auch nur über die Speicherdauer in Bezug auf Klassenmitglieder gesprochen. Was ist damit, dass es nicht instanzspezifisch ist, das ist auch eine Eigenschaft von static
no? Oder ist das Lagerdauer?
Was ist nun mit dem Fall mit static
und dem Dateibereich? Werden alle globalen Variablen standardmäßig als statisch gespeichert? Folgendes (aus Abschnitt 3.7.1) scheint dies anzuzeigen:
1 Alle Variablen, die keine dynamische Speicherdauer haben, keine Thread-Speicherdauer haben und nicht lokal sind, haben eine statische Speicherdauer. Die Speicherung für diese Unternehmen dauert für die Dauer des Programms (3.6.2, 3.6.3).
In welcher static
Beziehung steht die Verknüpfung einer Variablen?
Dieses ganze static
Schlüsselwort ist geradezu verwirrend. Kann jemand die verschiedenen Verwendungszwecke für Englisch klären und mir auch sagen, wann ich ein static
Klassenmitglied initialisieren soll ?
Antworten:
Variablen:
static
Variablen existieren für die "Lebensdauer" der Übersetzungseinheit, in der sie definiert ist , und:constexpr
. Alles andere, und Sie erhalten eine separate Variable in jeder Übersetzungseinheit, was verrückt verwirrend ist.)static
, können aber sowohl von der Klasse als auch von einer Instanz (wiestd::string::npos
) angesprochen werden . [Hinweis: Sie können statische Elemente in einer Klasse deklarieren , diese sollten jedoch normalerweise noch in einer Übersetzungseinheit (CPP-Datei) definiert werden. Daher gibt es nur eines pro Klasse.]Standorte als Code:
Bevor eine Funktion in einer Übersetzungseinheit ausgeführt wird (möglicherweise nach Beginn der
main
Ausführung), werden die Variablen mit statischer Speicherdauer (Namespace-Bereich) in dieser Übersetzungseinheit "konstant initialisiert" (soweitconstexpr
möglich oder ansonsten auf Null) und dann nicht Einheimische werden in der Reihenfolge, in der sie in der Übersetzungseinheit definiert sind, ordnungsgemäß "dynamisch initialisiert" (für solche Dingestd::string="HI";
nichtconstexpr
). Schließlich wird die funktionslokale Statik initialisiert, wenn die Ausführung zum ersten Mal die Zeile "erreicht", in der sie deklariert ist. Allestatic
Variablen werden in umgekehrter Reihenfolge der Initialisierung zerstört.Der einfachste Weg, dies zu
constexpr
korrigieren, besteht darin, alle statischen Variablen, die nicht initialisiert wurden, in statische Funktionslokale zu verwandeln. Dadurch wird sichergestellt, dass alle Ihre Statics / Globals ordnungsgemäß initialisiert werden, wenn Sie versuchen, sie unabhängig davon zu verwenden, wodurch die statische Initialisierung verhindert wird Fiasko bestellen .Seien Sie vorsichtig, denn wenn die Spezifikation besagt, dass Namespace-Scope-Variablen standardmäßig eine "statische Speicherdauer" haben, bedeuten sie die "Lebensdauer der Übersetzungseinheit", aber das bedeutet nicht , dass außerhalb der Datei nicht darauf zugegriffen werden kann.
Funktionen
Deutlich einfacher,
static
wird häufig als Klassenmitgliedsfunktion verwendet und nur sehr selten für eine freistehende Funktion.Eine statische Elementfunktion unterscheidet sich von einer regulären Elementfunktion dadurch, dass sie ohne Instanz einer Klasse aufgerufen werden kann. Da sie keine Instanz hat, kann sie nicht auf nicht statische Elemente der Klasse zugreifen. Statische Variablen sind nützlich, wenn Sie eine Funktion für eine Klasse haben möchten, die sich definitiv nicht auf Instanzmitglieder bezieht, oder um
static
Mitgliedsvariablen zu verwalten.Eine
static
freie Funktion bedeutet, dass die Funktion von keiner anderen Übersetzungseinheit referenziert wird und der Linker sie daher vollständig ignorieren kann. Dies hat eine kleine Anzahl von Zwecken:static void log(const char*) {}
in jede CPP-Datei einfügen, und sie könnten sich alle auf unterschiedliche Weise protokollieren.quelle
classname::
Bereich angeben muss . Statische Klassenmitgliedsfunktionen sind wie globale Funktionen, jedoch auf die Klasse beschränkt oder wie normale Mitglieder, jedoch ohnethis
(das ist keine Wahl - diese beiden sollten gleichwertig sein).namespace A { static int x; }
, was eine interne Verknüpfung bedeutet und sich stark vom Verhalten statischer Klassendatenelemente unterscheidet .Statische Speicherdauer bedeutet, dass sich die Variable während der gesamten Lebensdauer des Programms an derselben Stelle im Speicher befindet.
Die Verknüpfung ist dazu orthogonal.
Ich denke, das ist der wichtigste Unterschied, den Sie machen können. Verstehen Sie dies und den Rest, und denken Sie daran, es sollte einfach sein (nicht direkt an @Tony zu sprechen, sondern wer auch immer dies in Zukunft lesen könnte).
Das Schlüsselwort
static
kann verwendet werden, um interne Verknüpfung und statischen Speicher zu bezeichnen, aber im Wesentlichen sind diese unterschiedlich.Ja. Unabhängig davon, wann die Variable initialisiert wird (beim ersten Aufruf der Funktion und wenn der Ausführungspfad den Deklarationspunkt erreicht), befindet sie sich während der gesamten Laufzeit des Programms an derselben Stelle im Speicher. In diesem Fall
static
gibt es statischen Speicher.Ja, alle Globals haben per Definition eine statische Speicherdauer (jetzt, da wir geklärt haben, was das bedeutet). Aber Namespace scoped Variablen nicht mit erklärt
static
, weil das ihnen geben würde interne Bindung, so eine Variable pro Übersetzungseinheit.Es gibt eine interne Verknüpfung von Variablen mit Namespace-Gültigkeitsbereich. Es gibt Mitgliedern und lokalen Variablen statische Speicherdauer.
Lassen Sie uns das alles erweitern:
Auf jeden Fall, es sei denn, Sie sind damit vertraut. :) Um zu vermeiden, dass der Sprache neue Schlüsselwörter hinzugefügt werden, hat das Komitee diese IMO zu diesem Zweck wiederverwendet - Verwirrung. Es wird verwendet, um verschiedene Dinge zu bezeichnen (könnte ich sagen, wahrscheinlich gegensätzliche Dinge).
quelle
static int x
im Namespace-Bereich sage , gibt es dann nicht statischen Speicher?Um die Frage zu klären, würde ich die Verwendung des Schlüsselworts "statisch" lieber in drei verschiedene Formen einteilen:
(EIN). Variablen
(B). Funktionen
(C). Mitgliedsvariablen / Funktionen von Klassen
Die folgende Erklärung folgt für jede der Unterüberschriften:
(A) 'statisches' Schlüsselwort für Variablen
Dieser kann etwas knifflig sein, aber wenn er richtig erklärt und verstanden wird, ist er ziemlich einfach.
Um dies zu erklären, ist es zunächst sehr nützlich, den Umfang, die Dauer und die Verknüpfung von Variablen zu kennen, ohne die das trübe Konzept des staischen Schlüsselworts immer nur schwer zu erkennen ist
1. Bereich : Legt fest, wo in der Datei auf die Variable zugegriffen werden kann. Es kann zwei Arten geben: (i) Lokaler oder Blockbereich . (ii) Globaler Geltungsbereich
2. Dauer : Legt fest, wann eine Variable erstellt und zerstört wird. Es gibt wieder zwei Arten: (i) Automatische Speicherdauer (für Variablen mit lokalem oder Blockbereich). (ii) Statische Speicherdauer (für Variablen mit globalem Gültigkeitsbereich oder lokale Variablen (in einer Funktion oder einem Codeblock) mit statischem Bezeichner).
3. Verknüpfung : Legt fest, ob auf eine Variable in einer anderen Datei zugegriffen (oder verknüpft) werden kann. Wieder (und zum Glück) gibt es zwei Arten: (i) Interne Verknüpfung (für Variablen mit Blockbereich und globalem Bereich / Dateibereich / globaler Namespace-Bereich) (ii) Externe Verknüpfung (für Variablen mit nur globalem Bereich / Dateibereich / Globaler Namespace-Bereich)
Im Folgenden finden Sie ein Beispiel zum besseren Verständnis einfacher globaler und lokaler Variablen (keine lokalen Variablen mit statischer Speicherdauer):
Jetzt kommt das Konzept der Verknüpfung. Wenn eine in einer Datei definierte globale Variable in einer anderen Datei verwendet werden soll, spielt die Verknüpfung der Variablen eine wichtige Rolle.
Die Verknüpfung globaler Variablen wird durch die Schlüsselwörter (i) statisch und (ii) extern angegeben
(Jetzt bekommst du die Erklärung)
Das statische Schlüsselwort kann auf Variablen mit lokalem und globalem Gültigkeitsbereich angewendet werden. In beiden Fällen bedeuten sie unterschiedliche Bedeutungen. Ich werde zuerst die Verwendung des Schlüsselworts 'static' in Variablen mit globalem Gültigkeitsbereich erläutern (wobei ich auch die Verwendung des Schlüsselworts 'extern' erläutere) und später die Verwendung für Schlüsselwörter mit lokalem Gültigkeitsbereich.
1. Statisches Schlüsselwort für Variablen mit globalem Gültigkeitsbereich
Globale Variablen haben eine statische Dauer, dh sie verlassen nicht den Gültigkeitsbereich, wenn ein bestimmter Codeblock (z. B. main ()), in dem er verwendet wird, endet. Abhängig von der Verknüpfung kann auf sie entweder nur innerhalb derselben Datei zugegriffen werden, in der sie deklariert sind (für statische globale Variablen), oder außerhalb der Datei, sogar außerhalb der Datei, in der sie deklariert sind (globale Variablen vom externen Typ).
Im Fall einer globalen Variablen mit externem Bezeichner und wenn auf diese Variable außerhalb der Datei zugegriffen wird, in der sie initialisiert wurde, muss sie in der Datei, in der sie verwendet wird, vorwärts deklariert werden, genau wie eine Funktion weitergeleitet werden muss deklariert, wenn sich die Definition in einer anderen Datei befindet als der, in dem sie verwendet wird.
Wenn die globale Variable dagegen ein statisches Schlüsselwort hat, kann sie nicht in einer Datei verwendet werden, außerhalb derer sie deklariert wurde.
(Zur Verdeutlichung siehe Beispiel unten)
z.B:
main3.cpp
Jetzt kann jede Variable in c ++ entweder eine Konstante oder eine Nicht-Konstante sein, und für jede 'Konstanz' erhalten wir zwei Fälle von Standard-C ++ - Verknüpfung, falls keine angegeben ist:
(i) Wenn eine globale Variable nicht const ist, ist ihre Verknüpfung standardmäßig extern , dh auf die globale Variable nicht const kann in einer anderen CPP-Datei durch Vorwärtsdeklaration unter Verwendung des Schlüsselworts extern (mit anderen Worten non const global) zugegriffen werden Variablen haben eine externe Verknüpfung (natürlich mit statischer Dauer). Auch die Verwendung des externen Schlüsselworts in der Originaldatei, in der es definiert wurde, ist redundant. Verwenden Sie in diesem Fall den Bezeichner 'static' vor dem Variablentyp, um eine nicht konstante globale Variable für externe Dateien unzugänglich zu machen .
(ii) Wenn eine globale Variable const ist, ist ihre Verknüpfung standardmäßig statisch , dh auf eine globale const-Variable kann in einer anderen Datei als der definierten nicht zugegriffen werden (mit anderen Worten, globale const-Variablen haben eine interne Verknüpfung (mit statischer Dauer) natürlich)). Auch die Verwendung eines statischen Schlüsselworts, um zu verhindern, dass auf eine globale Variable const in einer anderen Datei zugegriffen wird, ist redundant. Verwenden Sie hier den Bezeichner 'extern' vor dem Typ der Variablen , um eine konstante globale Variable mit einer externen Verknüpfung zu versehen
Hier ist eine Zusammenfassung für globale Bereichsvariablen mit verschiedenen Verknüpfungen
Als nächstes untersuchen wir, wie sich die oben genannten globalen Variablen verhalten, wenn auf sie in einer anderen Datei zugegriffen wird.
2. Statisches Schlüsselwort für Variablen mit lokalem Bereich
Aktualisierungen (August 2019) des statischen Schlüsselworts für Variablen im lokalen Bereich
Dies kann weiter in zwei Kategorien unterteilt werden:
(i) statisches Schlüsselwort für Variablen innerhalb eines Funktionsblocks und (ii) statisches Schlüsselwort für Variablen innerhalb eines unbenannten lokalen Blocks.
(i) statisches Schlüsselwort für Variablen innerhalb eines Funktionsblocks.
Ich habe bereits erwähnt, dass Variablen mit lokalem Gültigkeitsbereich eine automatische Dauer haben, dh sie entstehen, wenn der Block eingegeben wird (sei es ein normaler Block, sei es ein Funktionsblock), und hören auf zu existieren, wenn der Block endet, kurz gesagt, Variablen mit lokalem Gültigkeitsbereich haben automatische Dauer und automatische Dauervariablen (und Objekte) haben keine Verknüpfung, was bedeutet, dass sie außerhalb des Codeblocks nicht sichtbar sind.
Wenn ein statischer Bezeichner auf eine lokale Variable innerhalb eines Funktionsblocks angewendet wird, ändert er die Dauer der Variablen von automatisch in statisch und ihre Lebensdauer entspricht der gesamten Dauer des Programms. Dies bedeutet, dass sie einen festen Speicherort hat und ihr Wert nur initialisiert wird einmal vor dem Programmstart wie in der CPP-Referenz angegeben (Initialisierung sollte nicht mit Zuweisung verwechselt werden)
Schauen wir uns ein Beispiel an.
Wenn man das obige Kriterium für statische lokale Variablen und statische globale Variablen betrachtet, könnte man versucht sein zu fragen, was der Unterschied zwischen ihnen sein könnte. Während die globalen Variablen an jedem Punkt in dem Code innerhalb zugänglich sind (in gleichen als auch unterschiedlichen Übersetzungseinheit in Abhängigkeit von der const -ness und extern -ness), ist eine statische Variable innerhalb eines Funktionsblocks definiert , die nicht direkt zugänglich sind . Die Variable muss durch den Funktionswert oder die Referenz zurückgegeben werden. Lassen Sie uns dies anhand eines Beispiels demonstrieren:
Weitere Erläuterungen zur Auswahl der statischen globalen und statischen lokalen Variablen finden Sie in diesem Stackoverflow-Thread
(ii) statisches Schlüsselwort für Variablen innerhalb eines unbenannten lokalen Blocks.
Auf statische Variablen innerhalb eines lokalen Blocks (kein Funktionsblock) kann außerhalb des Blocks nicht zugegriffen werden, sobald der lokale Block den Gültigkeitsbereich verlässt. Keine Einschränkungen dieser Regel.
In C ++ 11 wurde das Schlüsselwort eingeführt,
constexpr
das die Auswertung eines Ausdrucks zur Kompilierungszeit garantiert und es dem Compiler ermöglicht, den Code zu optimieren. Wenn nun der Wert einer statischen const-Variablen innerhalb eines Bereichs zur Kompilierungszeit bekannt ist, wird der Code auf ähnliche Weise wie bei optimiertconstexpr
. Hier ist ein kleines BeispielIch empfehle den Lesern auch, den Unterschied zwischen
constexpr
undstatic const
für Variablen in diesem Stackoverflow-Thread nachzuschlagen . Damit ist meine Erklärung für das statische Schlüsselwort abgeschlossen, das auf Variablen angewendet wird.B. 'statisches' Schlüsselwort für Funktionen
In Bezug auf Funktionen hat das statische Schlüsselwort eine einfache Bedeutung. Hier bezieht es sich auf die Verknüpfung der Funktion Normalerweise haben alle in einer CPP-Datei deklarierten Funktionen standardmäßig eine externe Verknüpfung, dh eine in einer Datei definierte Funktion kann in einer anderen CPP-Datei durch Vorwärtsdeklaration verwendet werden.
Die Verwendung eines statischen Schlüsselworts vor der Funktionsdeklaration beschränkt die Verknüpfung mit intern , dh eine statische Funktion kann nicht innerhalb einer Datei außerhalb ihrer Definition verwendet werden.
C. Staitc-Schlüsselwort, das für Elementvariablen und Funktionen von Klassen verwendet wird
1. Schlüsselwort 'static' für Mitgliedsvariablen von Klassen
Ich beginne hier direkt mit einem Beispiel
In diesem Beispiel behält die statische Variable m_designNum ihren Wert bei, und diese einzelne private Mitgliedsvariable (da sie statisch ist) wird s / w mit allen Variablen des Objekttyps DesignNumber geteilt
Ebenso wie andere Elementvariablen sind statische Elementvariablen einer Klasse keinem Klassenobjekt zugeordnet, was durch das Drucken von anyNumber in der Hauptfunktion demonstriert wird
const vs nicht-const statische Elementvariablen in der Klasse
(i) statische Elementvariablen der Klasse " Nicht-Konstante" Im vorherigen Beispiel waren die statischen Elemente (sowohl öffentliche als auch private) Nichtkonstanten. Der ISO-Standard verbietet die Initialisierung von nicht konstanten statischen Elementen in der Klasse. Daher müssen sie wie im vorherigen Beispiel nach der Klassendefinition initialisiert werden, mit der Einschränkung, dass das statische Schlüsselwort weggelassen werden muss
(ii) const-statische Elementvariablen der Klasse Dies ist unkompliziert und entspricht der Konvention der Initialisierung anderer const-Elementvariablen, dh die konstanten statischen Elementvariablen einer Klasse können zum Zeitpunkt der Deklaration initialisiert und am Ende initialisiert werden der Klassendeklaration mit einer Einschränkung, dass das Schlüsselwort const dem statischen Element hinzugefügt werden muss, wenn es nach der Klassendefinition initialisiert wird.
Ich würde jedoch empfehlen, die statischen Elementvariablen const am Deklarationspunkt zu initialisieren. Dies entspricht der Standard-C ++ - Konvention und lässt den Code sauberer aussehen
Weitere Beispiele für statische Elementvariablen in einer Klasse finden Sie unter folgendem Link unter learncpp.com http://www.learncpp.com/cpp-tutorial/811-static-member-variables/
2. Schlüsselwort 'static' für die Mitgliedsfunktion von Klassen
Genau wie Mitgliedsvariablen von Klassen statisch sein können, können auch Mitgliedsfunktionen von Klassen statisch sein. Normale Elementfunktionen von Klassen sind immer einem Objekt des Klassentyps zugeordnet. Im Gegensatz dazu sind statische Elementfunktionen einer Klasse keinem Objekt der Klasse zugeordnet, dh sie haben keinen * diesen Zeiger.
Zweitens, da die statischen Elementfunktionen der Klasse keinen * diesen Zeiger haben, können sie mit dem Operator Klassenname und Bereichsauflösung in der Hauptfunktion (ClassName :: functionName ();) aufgerufen werden.
Drittens können statische Elementfunktionen einer Klasse nur auf statische Elementvariablen einer Klasse zugreifen, da nicht statische Elementvariablen einer Klasse zu einem Klassenobjekt gehören müssen.
Weitere Beispiele für statische Elementfunktionen in einer Klasse finden Sie unter folgendem Link von learncpp.com
http://www.learncpp.com/cpp-tutorial/812-static-member-functions/
quelle
struct Foo{static const std::string name = "cpp";};
ist ein Fehler,name
der außerhalb der Klasse definiert werden muss. Mit Inline-Variablen, die in c ++ 17 eingeführt wurden, kann Folgendes codiert werden:struct Foo{static inline const std::string name = "cpp";};
2) Auf öffentliche statische Member- / Member-Funktionen kann über den Klassennamen mit dem Bereichsauflösungsoperator und auch über eine Instanz mit dem Punktoperator zugegriffen werden (z. B. instance.some_static_method ())Es ist eigentlich ganz einfach. Wenn Sie eine Variable im Bereich einer Funktion als statisch deklarieren, bleibt ihr Wert zwischen aufeinanderfolgenden Aufrufen dieser Funktion erhalten. So:
wird
678
statt angezeigt666
, weil es sich an den inkrementierten Wert erinnert.Die statischen Elemente behalten ihren Wert über Instanzen der Klasse hinweg bei. Also der folgende Code:
gibt 4 aus, da first.a und second.a im Wesentlichen dieselbe Variable sind. Informationen zur Initialisierung finden Sie in dieser Frage.
quelle
Wenn Sie eine
static
Variable im Dateibereich deklarieren , ist diese Variable nur in dieser bestimmten Datei verfügbar (technisch gesehen die * Übersetzungseinheit, aber lassen Sie uns dies nicht zu sehr komplizieren). Beispielsweise:a.cpp
b.cpp
main.cpp:
Für eine lokale Variable
static
bedeutet dies, dass die Variable mit Null initialisiert wird und ihren Wert zwischen den Aufrufen beibehält:Für Klassenvariablen bedeutet dies, dass es nur eine einzige Instanz dieser Variablen gibt, die von allen Mitgliedern dieser Klasse gemeinsam genutzt wird. Abhängig von den Berechtigungen kann auf die Variable von außerhalb der Klasse unter Verwendung ihres vollständig qualifizierten Namens zugegriffen werden.
Durch Markieren einer Nichtklassenfunktion als
static
wird die Funktion nur von dieser Datei aus zugänglich und von anderen Dateien aus nicht zugänglich.a.cpp
b.cpp
Wenn Sie sie als Klassenmitgliedsfunktionen markieren,
static
bedeutet dies, dass die Funktion nicht für eine bestimmte Instanz eines Objekts aufgerufen werden muss (dh keinenthis
Zeiger hat).quelle
Statische Variablen werden von jeder Instanz einer Klasse gemeinsam genutzt, anstatt dass jede Klasse eine eigene Variable hat.
Jede Instanz von 'MyClass' hat ihre eigene 'myVar', teilt jedoch dieselbe 'myStaticVar'. Tatsächlich benötigen Sie nicht einmal eine Instanz von MyClass, um auf 'myStaticVar' zuzugreifen, und Sie können außerhalb der Klasse wie folgt darauf zugreifen:
Bei Verwendung innerhalb einer Funktion als lokale Variable (und nicht als Klassenmitgliedsvariable) bewirkt das statische Schlüsselwort etwas anderes. Sie können eine persistente Variable erstellen, ohne einen globalen Bereich anzugeben.
Es ist eine globale Variable in Bezug auf die Persistenz ... aber ohne global in Bezug auf Umfang / Zugänglichkeit.
Sie können auch statische Elementfunktionen haben. Statische Funktionen sind im Grunde Funktionen, die keine Mitglieder sind, jedoch im Namespace des Klassennamens und mit privatem Zugriff auf die Mitglieder der Klasse.
Wenn Sie eine Mitgliedsfunktion aufrufen, gibt es einen versteckten Parameter namens 'this', der ein Zeiger auf die Instanz der Klasse ist, die die Funktion aufruft. Statische Elementfunktionen nicht haben , dass versteckte Parameter ... sie ohne eine Klasseninstanz aufrufbar sind, aber auch nicht zugreifen kann nicht statische Membervariablen einer Klasse, weil sie mit keinen ‚this‘ Zeiger auf Arbeit haben. Sie werden nicht für eine bestimmte Klasseninstanz aufgerufen.
quelle
myStaticVar
muss auch definiert werden. Ein bisschen wichtig zu erwähnen, dass Sie bei der Beantwortung einer Frage zur Semantik desstatic
Schlüsselworts nicht denken?Ich bin kein C-Programmierer, daher kann ich Ihnen keine Informationen über die Verwendung von Statik in einem C-Programm geben, aber wenn es um objektorientierte Programmierung geht, deklariert Statik grundsätzlich eine Variable, eine Funktion oder eine Klasse als gleich während der gesamten Laufzeit des Programms. Nehmen Sie zum Beispiel.
Wenn Sie diese Klasse in Ihrem Main instanziieren, machen Sie so etwas.
Diese beiden Klasseninstanzen unterscheiden sich vollständig voneinander und arbeiten unabhängig voneinander. Aber wenn Sie die Klasse A so neu erstellen würden.
Kehren wir noch einmal zur Hauptstraße zurück.
Dann würden a1 und a2 dieselbe Kopie von int x teilen, wobei alle Operationen an x in a1 die Operationen von x in a2 direkt beeinflussen würden. Also, wenn ich das tun würde
Beide Instanzen der Klasse A teilen statische Variablen und Funktionen. Hoffe das beantwortet deine Frage. Aufgrund meiner begrenzten Kenntnisse in C kann ich sagen, dass das Definieren einer Funktion oder Variablen als statisch bedeutet, dass nur für die Datei sichtbar ist, in der die Funktion oder Variable als statisch definiert ist. Dies sollte jedoch besser von einem C-Mitarbeiter und nicht von mir beantwortet werden. C ++ ermöglicht sowohl C- als auch C ++ - Möglichkeiten, Ihre Variablen als statisch zu deklarieren, da es vollständig abwärtskompatibel mit C ist.
quelle
Ja - Nicht global, z. B. eine lokale Funktionsvariable.
Richtig.
Das heißt, alle Instanzen von
R
Shareint R::a
-int R::a
werden niemals kopiert.Tatsächlich ein Global, der gegebenenfalls über einen Konstruktor / Destruktor verfügt - die Initialisierung wird erst nach dem Zugriff verschoben.
Für eine lokale Funktion ist sie extern. Zugriff: Es ist für die Funktion zugänglich (es sei denn, Sie geben es zurück).
Für eine Klasse ist es extern. Zugriff: Es gelten Standardzugriffsspezifizierer (öffentlich, geschützt, privat).
static
kann auch eine interne Verknüpfung angeben, je nachdem, wo sie deklariert ist (Datei / Namespace).Es hat zu viele Zwecke in C ++.
Es wird vorher automatisch initialisiert,
main
wenn es geladen ist und einen Konstruktor hat. Das mag sich nach einer guten Sache anhören, aber die Reihenfolge der Initialisierung liegt weit außerhalb Ihrer Kontrolle. Daher ist es sehr schwierig, die komplexe Initialisierung aufrechtzuerhalten, und Sie möchten dies minimieren. Wenn Sie eine statische Aufladung benötigen, funktionieren lokale Skalen in Bibliotheken und Bibliotheken viel besser Projekte. Bei Daten mit statischer Speicherdauer sollten Sie versuchen, dieses Design zu minimieren, insbesondere wenn es veränderbar ist (globale Variablen). Die Initialisierungszeit variiert auch aus einer Reihe von Gründen: Der Loader und der Kernel haben einige Tricks, um den Speicherbedarf zu minimieren und die Initialisierung abhängig von den betreffenden Daten zu verschieben.quelle
Statisches Objekt: Wir können statische Klassenmitglieder mit dem Schlüsselwort static definieren. Wenn wir ein Mitglied einer Klasse als statisch deklarieren, bedeutet dies, dass unabhängig davon, wie viele Objekte der Klasse erstellt werden, nur eine Kopie des statischen Elements vorhanden ist.
Ein statisches Element wird von allen Objekten der Klasse gemeinsam genutzt. Alle statischen Daten werden beim Erstellen des ersten Objekts auf Null initialisiert, wenn keine andere Initialisierung vorhanden ist. Wir können es nicht in die Klassendefinition einfügen, aber es kann außerhalb der Klasse initialisiert werden, wie im folgenden Beispiel beschrieben, indem die statische Variable mithilfe des Bereichsauflösungsoperators :: neu deklariert wird, um zu identifizieren, zu welcher Klasse sie gehört.
Versuchen wir das folgende Beispiel, um das Konzept der statischen Datenelemente zu verstehen:
Wenn der obige Code kompiliert und ausgeführt wird, führt dies zu folgendem Ergebnis:
Statische Funktionselemente: Indem Sie ein Funktionselement als statisch deklarieren, machen Sie es unabhängig von einem bestimmten Objekt der Klasse. Eine statische Elementfunktion kann auch dann aufgerufen werden, wenn keine Objekte der Klasse vorhanden sind und auf die statischen Funktionen nur mit dem Klassennamen und dem Bereichsauflösungsoperator :: zugegriffen wird.
Eine statische Elementfunktion kann nur von außerhalb der Klasse auf statische Datenelemente, andere statische Elementfunktionen und andere Funktionen zugreifen.
Statische Elementfunktionen haben einen Klassenbereich und keinen Zugriff auf diesen Zeiger der Klasse. Sie können eine statische Elementfunktion verwenden, um festzustellen, ob einige Objekte der Klasse erstellt wurden oder nicht.
Versuchen wir das folgende Beispiel, um das Konzept der statischen Funktionselemente zu verstehen:
Wenn der obige Code kompiliert und ausgeführt wird, führt dies zu folgendem Ergebnis:
quelle