Pregunta

Si tengo una clase llamada Test ::

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

cuando se hace staticVector get construida y cuándo se consigue destruido?

¿Es la creación de instancias del primer objeto de la clase de prueba, o al igual que las variables estáticas regulares?

Solo para aclarar, esta pregunta vino a la mente después de leer Conceptos de Lenguajes de Programación (Sebesta Ch-5.4.3.1) y que dice ::

  

Tenga en cuenta que cuando el estática modificador   aparece en la declaración de una   variable en una definición de clase en C ++,   Java y C #, no tiene nada que ver con   el tiempo de vida de la variable. En eso   contexto, significa que la variable es una   variable de clase, en lugar de una   Instancia variable. El uso múltiple   de una palabra reservada puede ser confuso   sobre todo a aquellos que están aprendiendo el   idioma.

¿entendió? : (

¿Fue útil?

Solución

Exactamente igual que las variables estáticas regulares (globales).

Otros consejos

Quiero escribir un texto sobre initializaton también, que puedo tarde enlace a.


En primer lugar la lista de posibilidades.

  • Espacio de nombres estático
  • Class estático
  • local estático

Espacio de nombres estático

  • Hay dos métodos de inicialización. (destinado a suceder en tiempo de compilación) y dinámico (destinado a suceder en tiempo de ejecución) de inicialización estática.
  • estático de inicialización sucede antes de cualquier inicialización dinámica, haciendo caso omiso de las relaciones de la unidad de traducción.
  • dinámico Initiaization se ordena en una unidad de traducción, mientras que no hay un orden particular en la inicialización estática. Objetos de espacio de nombres alcance de la misma unidad de traducción se inicializan de forma dinámica en el orden en el que aparece su definición.
  • objetos de tipo POD que se inicializan con expresiones constantes se inicializan de forma estática. Su valor puede ser invocada por inicialización dinámica de cualquier objeto, haciendo caso omiso de las relaciones de la unidad de traducción.
  • Si la inicialización se produce una excepción, std::terminate se llama.

Ejemplos:

Los siguientes programa imprime A(1) A(2)

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

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

Y el siguiente, sobre la base de la misma clase, impresiones A(2) A(1)

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

Vamos a suponer que hay una unidad de traducción, donde msg se define como la siguiente

char const *msg = "abc";

A continuación, las siguientes impresiones abc . Tenga en cuenta que p recibe inicialización dinámica. Pero debido a que la inicialización estática (char const* es un tipo POD y "abc" es una expresión constante de dirección) del 0 1 ocurre antes de eso, esto está muy bien, y <=> está garantizado que ser inicializado correctamente.

extern const char *msg;
struct P { P() { std::printf("%s", msg); } };
P p;
  • dinámico de inicialización de un objeto no está obligado a pasar antes de principal a toda costa. La inicialización debe ocurrir antes de la primera utilización de un objeto o función de su unidad de traducción, sin embargo. Esto es importante para bibliotecas de carga dinámica.

Clase estática

  • Se comportan como la estática de espacio de nombres.
  • Hay un error-informe sobre si se permite que el compilador para inicializar la estática de la clase en el primer uso de una función o un objeto de su unidad de traducción también (después de principal). La redacción de la norma actualmente sólo permite esto para objetos de ámbito de espacio de nombres - pero parece que tiene la intención de permitir que esta clase de alcance objetos también. Leer de espacio de nombres Ámbito .
  • En la estática de la clase que sean miembros de las plantillas de la regla es que sólo se inicializan si se utilizan nunca. No usarlos no va a ceder a una inicialización. Tenga en cuenta que, en cualquier caso, la inicialización sucederá como se ha explicado anteriormente. La inicialización no se retrasará porque es un miembro de la plantilla.

estática local

  • Para estáticos locales, las reglas especiales suceden.
  • objetos de tipo POD inicializa con expresión constante se inicializan antes de su bloque en el que se definen se introduce.
  • Otros objetos estáticos locales se inicializan en el primer control de tiempo pasa a través de su definición. La inicialización no se considera completa cuando se produce una excepción. La inicialización se intentó de nuevo la próxima vez.

Ejemplo: grabados el siguiente programa <=> :

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

En todos los casos anteriores, en ciertos casos limitados, para algunos objetos que no son necesarios para ser inicializado estáticamente, el compilador puede estáticamente inicializarlo, en lugar de inicializar dinámicamente. Este es un tema complicado, consulte esta respuesta para un ejemplo más detallado.

También tenga en cuenta que el orden de destrucción es el orden exacto de la finalización de la construcción de los objetos.Se trata de una común y ocurre en todo tipo de situaciones en C ++, incluso en los temporales Destructing.

Se pone construido al mismo tiempo, las variables globales consiguen construidos y destruido junto con las variables globales también.

En pocas palabras:
Una variable miembro estática se construye cuando se construyen las variables globales. El fin de la construcción de las variables globales no está definido, pero sucede antes de que se introduzca la principal función.

La destrucción ocurre cuando las variables globales son destruidos.

Las variables globales son destruidos en el orden inverso se construyeron; después de salir del principal-función.

Saludos, Ovanes

P.S .: sugiero echar un vistazo en C ++ -. Estándar, lo que explica (define) cómo y cuándo las variables globales o estáticas miembros están construidos o destruido

P.P.S .: Su código sólo declara una variable miembro estática, pero no inicializa él. Para inicializar se debe escribir en una de las unidades de compilación:

Prueba std :: vector :: staticVector;
o
Prueba std :: vector :: staticVector = std :: vector (/ * Héctor params aquí * /);

Algunas información específica VC ++ en caso de que eso es lo que está utilizando:

  1. estático variables de clase de construcción tiene lugar en el mismo tiempo que otras variables estáticas / globales.
  2. En Windows, la función de inicio CRT es responsable de esta construcción. Este es el punto de entrada real de la mayoría de los programas que compila (es la función que llama a su función principal / WinMain). Además, es responsable de la inicialización todo el soporte C en tiempo de ejecución (por ejemplo, que lo necesite para usar malloc).
  3. El fin de la construcción no está definido, sin embargo cuando se utiliza el compilador de Microsoft VC el orden de construcción para los tipos básicos va a estar bien, por ejemplo, es legal y seguro para escribir

statics.h: ... MiClase declaración ...     static const int a;     static int b;     int estática ar []; } statics.cpp:

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

Una variable miembro de la clase estática significa pesar de que hay varios objetos de la misma clase, la variable será el mismo para todos los objetos de la clase.

Así que, yo diría, que se construye cuando se crea una instancia primer objeto y destruido cuando se desctructed último objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top