Compartilhar via


Estático (C++)

O static palavra-chave pode ser usado para declarar variáveis, funções, os membros de dados de classe e funções de classe.

Por padrão, um objeto ou variável é definida fora todos os blocos tem duração estática e ligação externa.Duração estática significa que o objeto ou variável é alocada quando o programa for iniciado e é liberado quando o programa termina.Ligação externa significa que o nome da variável é visto de fora do arquivo no qual a variável é declarada.Por outro lado, a ligação interna significa que o nome não é visível fora do arquivo no qual a variável é declarada.

O static palavra-chave pode ser usada nas seguintes situações.

  • Quando você declara uma variável ou função no escopo do arquivo (global e/ou espaço para nome escopo), o static palavra-chave especifica que a variável ou função tem ligação interna.Quando você declara uma variável, a variável tem duração estática e o compilador inicializa em 0, a menos que você especifique outro valor.

  • Quando você declara uma variável em uma função, o static palavra-chave especifica que a variável reterá seu estado entre chamadas para essa função.

  • Ao declarar um membro de dados em uma declaração de classe, o static palavra-chave especifica que uma cópia do membro é compartilhada por todas as instâncias da classe.Um membro de dados estático deve ser definido no escopo do arquivo.Um membro de dados integral que você declara como conststatic pode ter um inicializador.

  • Quando você declara uma função de membro em uma declaração de classe, o static palavra-chave especifica que a função é compartilhada por todas as instâncias da classe.Uma função de membro estático não pode acessar um membro de instância porque a função não tem um implícito this ponteiro.Para acessar um membro de instância, declare a função com um parâmetro que é um ponteiro da instância ou referência.

  • Você não pode declarar os membros de uma união como estático.No entanto, uma união anônima globalmente declarada deve ser declarada explicitamente static.

Para obter mais informações, consulte auto, extern, e registrar.

Exemplo

O exemplo a seguir mostra como uma variável declarada static em uma função retém seu estado entre chamadas para essa função.

// static1.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
void showstat( int curr ) {
   static int nStatic;    // Value of nStatic is retained
                          // between each function call
   nStatic += curr;
   cout << "nStatic is " << nStatic << endl;
}

int main() {
   for ( int i = 0; i < 5; i++ )
      showstat( i );
}
  

O exemplo a seguir mostra o uso de static em uma classe.

// static2.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;
class CMyClass {
public:
   static int m_i;
};

int CMyClass::m_i = 0;
CMyClass myObject1;
CMyClass myObject2;

int main() {
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject1.m_i = 1;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   myObject2.m_i = 2;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;

   CMyClass::m_i = 3;
   cout << myObject1.m_i << endl;
   cout << myObject2.m_i << endl;
}
  

O exemplo a seguir mostra uma variável local declarada static em uma função de membro.A variável estática está disponível para todo o programa; todas as instâncias do tipo compartilham a mesma cópia da variável estática.

ObservaçãoObservação

Atribuir um valor a uma variável local estática em um aplicativo multithread não é thread-safe e não é recomendável-la como uma prática de programação.

// static3.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct C {
   void Test(int value) {
      static int var = 0;
      if (var == value) 
         cout << "var == value" << endl;
      else
         cout << "var != value" << endl;

      var = value;
   }
}; 

int main() {
   C c1;
   C c2;
   c1.Test(100);
   c2.Test(100);
}
  

Consulte também

Referência

Palavras-chave C++

Classes de armazenamento do C++

Especificadores de classe de armazenamento estático

Funções de membro estático

Controle de acesso e membros estáticos