Frage

Wenn ich eine Klasse namens Test ::

class Test
{
    static std::vector<int> staticVector;
};

wann hat staticVector erhalten aufgebaut und wann wird es zerstört werden?

Ist es mit der Instantiierung des ersten Objekts von Test-Klasse, oder einfach nur wie normale statischen Variablen?

Nur um zu klären, kam diese Frage meiner Meinung nach Konzepte von Programmiersprachen (Sebesta Ch-5.4.3.1), und es sagt ::

Lesen
  

Beachten Sie, dass, wenn die statisch Modifikator   erscheint in der Erklärung eines   Variable in einer Klassendefinition in C ++,   # Java und C, es hat nichts zu tun mit   die Lebensdauer der Variablen. dass   Kontext bedeutet die Variable A   Klassenvariable, anstatt ein   Instanzvariable. Die Mehrfachnutzung   ein reservierten Wort kann verwirrend sein,   insbesondere solche, die das Lernen   Sprache.

hast du verstanden? : (

War es hilfreich?

Lösung

Genau wie normale statische (globale) Variablen.

Andere Tipps

Ich möchte initializaton auch einen Text schreiben, was ich kann später Link zu.


Zuerst wird die Liste der Möglichkeiten.

  • Namespace Static
  • Klasse Static
  • Lokale Static

Namespace Static

  • Es gibt zwei Initialisierungsmethoden. statisch (bestimmt zum Zeitpunkt der Kompilierung geschehen) und dynamische (sollte zur Laufzeit geschehen) Initialisierung.
  • Static Initialisierung geschieht, bevor jede dynamische Initialisierung der Übersetzungseinheit Beziehungen zu vernachlässigen.
  • Dynamische Initiaization in einer Übersetzungseinheit bestellt, während es keine besondere Reihenfolge in statischer Initialisierung. Objekte Namespace Umfang der gleichen Übersetzungseinheit werden in der Reihenfolge, in der die Definition erscheint dynamisch initialisiert.
  • POD-Typ-Objekte, die mit konstanten Ausdrücken initialisiert werden statisch initialisiert. Ihr Wert kann von jedem Objekt der dynamischen Initialisierung geltend gemacht werden, die Übersetzungseinheit Beziehungen zu vernachlässigen.
  • Wenn die Initialisierung eine Ausnahme auslöst, std::terminate aufgerufen.

Beispiele:

Das folgende Programm druckt A(1) A(2)

struct A { 
  A(int n) { std::printf(" A(%d) ", n); } 
};

A a(1);
A b(2);

Und die folgenden, basierend auf der gleichen Klasse, druckt A(2) A(1)

extern A a;
A b(2);
A a(1);

Nehmen wir an, es gibt eine Übersetzungseinheit in dem msg wie folgt definiert wird

char const *msg = "abc";

Dann gelten die folgenden Drucke abc . Beachten Sie, dass p dynamische Initialisierung empfängt. Aber weil die statische Initialisierung (char const* ist ein POD-Typ und "abc" ist eine Adresse konstanter Ausdruck) von msg bevor das passiert, ist es in Ordnung, und msg ist garantiert korrekt initialisiert werden.

extern const char *msg;
struct P { P() { std::printf("%s", msg); } };
P p;
  • Dynamische Initialisierung eines Objekts wird nicht um jeden Preis vor den Haupt geschehen erforderlich. Die Initialisierung muss geschehen, vor dem ersten Gebrauch eines Objekts oder einer Funktion seiner Übersetzungseinheit, though. Dies ist wichtig für die dynamische ladbare Bibliotheken.

Klasse Static

  • benehmen sich wie Namespace Statik.
  • Es gibt einen Bug-Bericht, ob der Compiler erlaubt ist, zu Klasse Statik auf der ersten Verwendung einer Funktion oder ein Objekt seiner Übersetzungseinheit initialisiert wird (nach dem Haupt). Die Formulierung in der Norm zur Zeit erlaubt dies nur für Namespace Umfang Objekte - aber es scheint, es beabsichtigt, auch dies für Klassenbereich zu ermöglichen, Objekte. Lesen Sie Objekte Namespace Scope .
  • Für die Klasse Statik, das Mitglied von Vorlagen die Regel ist, dass sie nur initialisiert werden, wenn sie überhaupt verwendet werden. Nicht mit ihnen nicht zu einer Initialisierung ergeben. Beachten Sie, dass in jedem Fall die Initialisierung wie oben erläutert passieren wird. Die Initialisierung wird nicht verzögert werden, weil es ein Mitglied einer Vorlage.

Local Static

  • Für die lokale Statik, Sonderregeln passieren.
  • POD-Typ von Objekten mit konstantem Ausdruck initialisiert werden, bevor sie ihren Block initialisiert, in dem sie definiert sind, eingegeben.
  • Andere lokale statische Objekte werden bei der ersten Zeitsteuerung initialisiert durchläuft ihre Definition. Die Initialisierung wird nicht vollständig betrachtet, wenn eine Ausnahme ausgelöst wird. Die Initialisierung wird versucht, das nächste Mal wieder.

Beispiel: Das folgende Programm druckt 0 1 :

struct C { 
  C(int n) { 
    if(n == 0)
      throw n;
    this->n = n;
  }
  int n;
};

int f(int n) {
  static C c(n);
  return c.n;
}

int main() {
  try { 
    f(0); 
  } catch(int n) { 
    std::cout << n << " "; 
  }
  f(1); // initializes successfully
  std::cout << f(2);  
}

In allen oben genannten Fällen, in bestimmten begrenzten Fällen für einige Objekte, die nicht statisch initialisiert werden müssen, kann der Compiler es statisch initialisieren, anstatt sie dynamisch zu initialisieren. Dies ist ein heikles Thema finden Sie unter diese Antwort für ein ausführlicheres Beispiel.

Beachten Sie auch, dass die Reihenfolge der Zerstörung die genaue Reihenfolge der Fertigstellung des Baus der Objekte ist. Dies ist ein häufiges und geschieht in aller Art von Situationen, in C ++, einschließlich in destructing Provisorien.

Es ist die globalen Variablen zur gleichen Zeit gebaut wird erhalten und zerstört mit dem Globals entlang als auch.

Einfach gesagt:
Eine statische Membervariable ist so aufgebaut, wenn die globalen Variablen aufgebaut sind. Die Konstruktion der Reihenfolge der globalen Variablen nicht definiert, aber es geschieht, bevor die Hauptfunktion eingegeben wird.

Zerstörung geschieht, wenn globale Variablen zerstört werden.

Globale Variablen werden in der umgekehrten Reihenfolge zerstört sie gebaut wurden; nachdem die Haupt-Funktion zu verlassen.

Grüße, Ovanes

P. S .: Ich schlage vor, einen Blick auf C ++ zu nehmen -. Standard, der erklärt (definiert), wie und wann globale oder statische Membervariablen sind so konstruiert oder zerstört

P.P.S .: Ihr Code deklariert nur eine statische Membervariable, sie aber nicht initialisiert werden. Um es zu initialisieren Sie in einer der Kompilierungseinheiten schreiben müssen:

std :: vector Test :: staticVector;
oder in std :: vector Test :: staticVector = std :: vector (/ * Ctor params hier * /);

Einige spezifische VC ++ Informationen für den Fall, das ist, was Sie verwenden:

  1. Statische Klassenvariablen Konstruktion tritt zur gleichen Zeit wie andere statische / globale Variablen.
  2. In Fenstern, die CRT-Startfunktion ist für diese Konstruktion verantwortlich. Dies ist der eigentliche Einstiegspunkt der meisten Programme (es ist die Funktion, die Ihre Main / WinMain-Funktion aufruft) Sie kompilieren. Darüber hinaus ist es verantwortlich für die gesamte C-Laufzeitunterstützung für die Initialisierung (zB Sie es brauchen malloc zu verwenden).
  3. Die Reihenfolge der Konstruktion ist nicht definiert, aber wenn die Microsoft VC-Compiler der Reihenfolge der Konstruktion für Grundtypen verwendet, wird OK sein, zum Beispiel es legal und sicher schreiben

statics.h: ... MyClass Erklärung ...     static const int a;     static int b;     static int ar []; } statics.cpp:

const int MyClass::a = 2;
int MyClass::b = a+3;
int MyClass::ar[a] = {1,2}

Eine statische Klassenvariable bedeutet, auch wenn mehrere Objekte der gleichen Klasse sind, wird die Variable das gleiche für alle Objekte der Klasse.

Also, ich würde sagen, es ist aufgebaut, wenn erstes Objekt instanziiert wird und zerstört, wenn letztes Objekt desctructed wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top