Pergunta

Se eu tiver uma classe chamada Test ::

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

quando faz staticVector obter construído e quando é que se destruidos?

É com a instanciação do primeiro objeto da classe de teste, ou apenas como variáveis ??estáticas regulares?

Só para esclarecer, esta questão veio à minha mente depois de ler Conceitos de Linguagens de Programação (Sebesta Ch-5.4.3.1) e diz ::

Note que quando o estática modificador aparece na declaração de um variável na definição de uma classe em C ++, Java e C #, não tem nada a ver com o tempo de vida da variável. Naquilo contexto, significa que a variável é um classe variável, ao invés de um variável de instância. O uso múltiplo de uma palavra reservada pode ser confuso especialmente para aqueles aprender a linguagem.

você entendeu? : (

Foi útil?

Solução

Exatamente como variáveis ??estáticas regulares (globais).

Outras dicas

Eu quero escrever algum texto sobre initializaton também, o que eu posso mais tarde link a.


Primeiro, a lista de possibilidades.

  • Namespace estática
  • Class estática
  • Local estática

Namespace estática

  • Existem dois métodos de inicialização. estática (destinado a acontecer em tempo de compilação) e dinâmico (destinado a acontecer em tempo de execução) de inicialização.
  • estática Inicialização acontece antes qualquer inicialização dinâmica, desconsiderando das relações unidade de tradução.
  • dinâmico Initiaization é ordenado em uma unidade de tradução, enquanto não há nenhuma ordem particular na inicialização estática. Objetos de âmbito namespace da mesma unidade de tradução são inicializados de forma dinâmica na ordem em que sua definição aparece.
  • objetos do tipo POD que são inicializados com expressões constantes são estaticamente inicializado. Seu valor pode ser invocado pela inicialização dinâmica de qualquer objeto, desconsiderando das relações unidade de tradução.
  • Se a inicialização lança uma exceção, std::terminate é chamado.

Exemplos:

As seguintes impressões programa A(1) A(2)

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

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

E o seguinte, com base na mesma classe, impressões A(2) A(1)

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

Vamos fingir que é uma unidade de tradução em que msg é definido como o seguinte

char const *msg = "abc";

Em seguida, as seguintes impressões abc . Note-se que p recebe inicialização dinâmica. Mas porque a inicialização estática (char const* é um tipo POD, e "abc" é uma expressão constante endereço) do msg acontece antes disso, isso é bom, e msg é garantido para ser inicializado corretamente.

extern const char *msg;
struct P { P() { std::printf("%s", msg); } };
P p;
  • dinâmico inicialização de um objeto não é obrigado a acontecer antes de principal em todos os custos. A inicialização deve acontecer antes do primeiro uso de um objeto ou função de sua unidade de tradução, no entanto. Isso é importante para bibliotecas carregáveis ??dinâmicas.

classe estática

  • se comportar como estática de namespace.
  • Há um bug-relatório sobre se o compilador é permitido para inicializar estática de classe no primeiro uso de uma função ou objeto de sua unidade de tradução também (após principal). A formulação da Norma atualmente só permite isso para objetos de escopo de namespace - mas parece que tem a intenção de permitir que este para o escopo de classe objetos também. Leia Objetos de Namespace Âmbito .
  • Para estática de classe que são membros de modelos a regra é que eles só são inicializados se eles são sempre usados. Não usá-los não vai ceder a uma inicialização. Note-se que, em qualquer caso, a inicialização vai acontecer como explicado acima. Inicialização não será adiada porque é um membro de um modelo.

Local estática

  • Para estática locais, regras especiais acontecer.
  • objetos do tipo POD inicializados com expressão constante são inicializados antes de seu bloco em que eles são definidos é inserido.
  • Outros objetos estáticos locais são inicializados nos primeiros passes de controle de tempo por meio de sua definição. Inicialização não é considerada completa quando uma exceção é lançada. A inicialização será tentada novamente na próxima vez.

Exemplo: As seguintes gravuras programa 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);  
}

Em todos os casos acima, em certos casos limitados, para alguns objetos que não são necessários para ser inicializado estaticamente, o compilador pode estaticamente inicializar-lo, em vez de inicializar-lo dinamicamente. Esta é uma questão complicada, consulte esta resposta para um exemplo mais detalhado.

Além disso, note que a ordem de destruição é a ordem exata da conclusão da construção dos objetos. Este é um comum e acontece em todo o tipo de situações em C ++, incluindo no destruindo temporários.

Ele fica construídos ao mesmo tempo as variáveis ??globais são construídas e destruídas juntamente com os globals também.

Simplesmente falando:
Uma variável membro estático é construída quando as variáveis ??globais são construídas. A ordem de construção de variáveis ??globais não está definido, mas acontece antes da principal função é inserido.

A destruição acontece quando variáveis ??globais são destruídos.

As variáveis ??globais são destruídos na ordem inversa foram construídos; depois de sair do main-função.

Saudações,
Ovanes

P.S .: Eu sugiro dar uma olhada em C ++ -. Padrão, que explica (define) como e quando as variáveis ??de membros globais ou estáticos são construídas ou destruídas

P.P.S .: Seu código só declara uma variável membro estático, mas não inicializa-lo. Para inicializar que você deve escrever em uma das unidades de compilação:

std :: vector Test :: staticVector;
ou
std :: Teste vector :: staticVector = std :: vector (/ * ctor params aqui * /);

informações Alguns específica VC ++ no caso de que o que você está usando:

  1. Estático variáveis ??de classe construção ocorre ao mesmo tempo que outros static / variáveis ??globais.
  2. No windows, a função CRT inicialização é responsável por esta construção. Este é o ponto de entrada real da maioria dos programas que compilam (é a função que chama a sua principal / função WinMain). Além disso, é responsável por inicializar todo o suporte C tempo de execução (por exemplo, você precisa dele para usar malloc).
  3. A ordem de construção é indefinido, no entanto, quando usando o compilador VC microsoft a ordem de construção para tipos básicos serão OK, por exemplo, é legal e seguro para escrever

statics.h: ... declaração MyClass ... estática const int a; int b estático; int ar estático []; } statics.cpp:

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

Um meio estático variáveis ??membro da classe, embora existam vários objetos da mesma classe, a variável será o mesmo para todos os objetos da classe.

Então, eu diria, é construído quando o primeiro objeto é instanciado e destruído quando o último objeto é desctructed.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top