Question

Si j'ai une classe appelée test ::

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

quand est staticVector se construit et quand il se destructed?

Est-ce avec l'instanciation du premier objet de la classe de test, ou tout simplement comme des variables statiques régulières?

Juste pour clarifier les choses, cette question est venue à l'esprit après avoir lu Concepts des langages de programmation (Sebesta Ch-5.4.3.1) et il dit ::

  

Notez que lorsque le modificateur statique   apparaît dans la déclaration d'un   variable dans une définition de classe en C ++,   Java et C #, il n'a rien à voir avec   la durée de vie de la variable. dans ce   contexte, cela signifie que la variable est une   variable de classe, au lieu d'un   variable d'instance. L'utilisation multiple   d'un mot réservé peut être source de confusion   en particulier à ceux qui apprennent la   langue.

avez-vous compris? : (

Était-ce utile?

La solution

Exactement comme variables statiques régulières (globales).

Autres conseils

Je veux écrire un texte au sujet initializaton aussi, que je peux lien plus tard.


D'abord la liste des possibilités.

  • Namespace statique
  • Classe statique
  • Local statique

Espace de noms statique

  • Il existe deux méthodes d'initialisation. initialisation statique (destiné à se produire au moment de la compilation) et dynamique (destiné à se produire lors de l'exécution).
  • statique Initialisation arrive avant une initialisation dynamique, sans tenir compte des relations de l'unité de traduction.
  • dynamique Initiaization est commandé dans une unité de traduction, alors qu'il n'y a pas d'ordre particulier dans l'initialisation statique. Objets de champ d'espace de noms de la même unité de traduction sont dynamiquement initialisés dans l'ordre dans lequel leur définition apparaît.
  • objets de type POD qui sont initialisés avec des expressions constantes sont initialisées de manière statique. Leur valeur peut être invoquée par l'initialisation dynamique de tout objet, sans tenir compte des relations de l'unité de traduction.
  • Si l'initialisation lance une exception, est appelée std::terminate.

Exemples:

Les programme suivant A(1) A(2)

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

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

Et ce qui suit, en fonction de la même classe, imprime A(2) A(1)

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

Feignons il y a une unité de traduction où est définie comme msg les éléments suivants

char const *msg = "abc";

Ensuite, les impressions suivantes abc . Notez que l'initialisation dynamique reçoit p. Mais parce que l'initialisation statique (est un type char const* POD, et une adresse est "abc" expression constante) de se produit avant que 0 1, cela est bien beau, et est garanti <=> être correctement initialisé.

extern const char *msg;
struct P { P() { std::printf("%s", msg); } };
P p;
  • dynamique l'initialisation d'un objet est pas tenu de se produire avant principal à tout prix. L'initialisation doit se produire avant la première utilisation d'un objet ou d'une fonction de son unité de traduction, cependant. Ceci est important pour les bibliothèques chargeables dynamiques.

Classe statique

  • Comportez-vous comme espace de noms statics.
  • Il y a un rapport de bug si le compilateur est autorisé à initialiser la classe sur statics la première utilisation d'une fonction ou objet de son unité de traduction trop (après principal). Le libellé de la norme permet actuellement que ce pour les objets de portée d'espace de noms - mais il semble qu'il a l'intention de permettre à ce pour les objets champ de classe aussi. Lire objets de Scope Namespace.
  • Pour de classe qui statics sont membres de modèles, la règle est qu'ils ne sont initialisés si elles sont toujours utilisés. Ne pas utiliser les ne donnera pas à une initialisation. Notez que dans tous les cas, l'initialisation se produira comme expliqué ci-dessus. L'initialisation ne sera pas retardée parce qu'il est membre d'un modèle.

Local statique

  • statiques locaux, des règles particulières se produisent.
  • Les objets de type POD initialisés avec une expression constante sont initialisés avant leur bloc dans lequel elles sont définies est saisie.
  • D'autres objets statiques sont initialisés au premier contrôle de temps passe par leur définition. L'initialisation est pas considérée comme complète lorsqu'une exception est levée. L'initialisation sera jugé à nouveau la prochaine fois.

Exemple: Le programme suivant <=> :

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);  
}

Dans tous les cas ci-dessus, dans certains cas limités, pour certains objets qui ne sont pas nécessaires pour initialiser statiquement, le compilateur peut initialiser statiquement, au lieu d'initialisation dynamiquement. Ceci est une question délicate, voir cette réponse pour un exemple plus détaillé.

Notez également que l'ordre de destruction est l'ordre exact de l'achèvement de la construction des objets.Ceci est une commune et qui se passe dans toutes sortes de situations en C ++, y compris dans des temporaires autodestruction.

Il se construit en même temps les variables globales se construisent et destructed ainsi que les GLOBALS ainsi.

En bref:
Une variable membre statique est réalisé lorsque les variables globales sont construites. L'ordre de construction des variables globales n'est pas défini, mais il arrive avant que la fonction principale est saisie.

La destruction se produit lorsque les variables globales sont détruites.

Les variables globales sont détruites dans l'ordre inverse, ils ont été construits; après la sortie de la fonction principale.

Cordialement,
Ovanes

P.S .: Je vous suggère de jeter un oeil à C ++ -. Standard, ce qui explique (Les définit) comment et quand les variables membres globales ou statiques sont construits ou détruits

P.P.S .: Votre code déclare qu'une variable membre statique, mais n'initialise pas. Pour l'initialiser, vous devez écrire dans l'une des unités de compilation:

std :: vector Test :: staticVector;
ou
std :: vector Test :: staticVector = std :: vector (/ * cteur params ici * /);

Certaines informations spécifiques de VC dans le cas où ce que vous utilisez:

  1. Construction statique des variables de classe se produit en même temps que d'autres variables statiques / globales.
  2. Dans les fenêtres, la fonction de démarrage du CRT est responsable de cette construction. Ceci est le point d'entrée réelle de la plupart des programmes que vous compilez (il est la fonction qui appelle votre fonction principale / winmain). De plus, il est responsable de l'initialisation de l'ensemble du support d'exécution C (par exemple, vous avez besoin d'utiliser malloc).
  3. L'ordre de construction est définie, mais lorsque vous utilisez le compilateur VC Microsoft l'ordre de construction pour les types de base sera OK, par exemple, il est d'écrire juridique et sécuritaire

statics.h: ... MyClass déclaration ...     const int statique;     int b statique;     int statique ar []; } statics.cpp:

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

Une variable de membre de classe statique signifie que même si il y a de multiples objets de la même classe, la variable sera la même pour tous les objets de la classe.

Alors, je dirais, il est construit en premier objet est instancié et détruit lors de la dernière objet est desctructed.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top