Estático (C++)
A palavra-chave static pode ser usada para declarar variáveis, funções, membros de dados de classe e funções de classe.
Por padrão, um objeto ou uma variável que é definida fora de todos os blocos tem duração estática e vinculação externa. Duração estática significa que o objeto ou a variável são alocados quando o programa inicia e desalocados quando o programa termina. Vinculação externa significa que o nome da variável é visível fora do arquivo em que a variável é declarada. Por outro lado, a vinculação externa significa que o nome não é visível fora do arquivo em que a variável é declarada.
A palavra-chave static pode ser usada nas seguintes situações:
Ao declarar uma variável ou função no escopo do arquivo (escopo global e/ou de namespace), a palavra-chave static especifica que a variável ou função possui vinculação interna. Ao declarar uma variável, a variável tem duração estática, e o compilador a inicializa com o valor 0 a menos que você especifique outro valor.
Ao declarar uma variável em uma função, a palavra-chave static especifica que a variável manterá seu estado entre as chamadas para essa função.
Ao declarar um membro de dados em uma declaração de classe, a palavra-chave static especifica que uma cópia do membro é compartilhada por todas as instâncias da classe. Um membro de dados static deve ser definido no escopo do arquivo. Um membro de dados integral que você declara como const static pode ter um inicializador.
Ao declarar uma função de membro em uma declaração de classe, a palavra-chave static especifica que a função é compartilhada por todas as instâncias da classe. Uma função de membro static não pode acessar um membro de instância porque a função não tem um ponteiro this implícito. Para acessar um membro de instância, declare a função com um parâmetro que seja um ponteiro ou uma referência de instância.
Não é possível declarar os membros de uma união como estáticos. No entanto, uma união anônima globalmente declarada deve ser explicitamente declarada como static.
Para obter mais informações, consulte auto, extern e register.
Exemplo
O exemplo a seguir mostra como uma variável declarada static em uma função mantém o estado entre chamadas para a 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 o programa inteiro; todas as instâncias do tipo compartilham a mesma cópia da variável estática.
Dica
Atribuir um valor a uma variável local estática em um aplicativo com multithread não tem segurança de thread e não recomendamos isso 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);
}