Membros de dados estáticos (C++)
Classes podem conter dados de membro estático e funções de membro.Quando um membro de dados é declarado como estático, apenas uma cópia dos dados é mantida para todos os objetos da classe.(Para obter mais informações, consulte Funções de membro estático.)
Membros de dados estáticos não são parte dos objetos de um tipo de classe determinada; eles são objetos separados.Como resultado, a declaração de um membro de dados estáticos não é considerada uma definição.O membro de dados é declarado no escopo de classe, mas a definição é realizada no escopo do arquivo.Esses membros estáticos tem uma ligação externa.O exemplo a seguir ilustra isso:
// static_data_members.cpp
class BufferedOutput
{
public:
// Return number of bytes written by any object of this class.
short BytesWritten()
{
return bytecount;
}
// Reset the counter.
static void ResetCount()
{
bytecount = 0;
}
// Static member declaration.
static long bytecount;
};
// Define bytecount in file scope.
long BufferedOutput::bytecount;
int main()
{
}
No código anterior, o membro bytecount é declarado na classe BufferedOutput, mas ele deve ser definido fora da declaração de classe.
Membros de dados estáticos podem ser chamados sem fazer referência a um objeto do tipo de classe.O número de bytes gravados usando BufferedOutput objetos podem ser obtidos da seguinte maneira:
long nBytes = BufferedOutput::bytecount;
Para o membro estático existir, não é necessário que todos os objetos do tipo de classe existirem.Membros estáticos também podem ser acessados usando a seleção de membro (. e – >) operadores.Por exemplo:
BufferedOutput Console;
long nBytes = Console.bytecount;
No caso anterior, a referência ao objeto (Console) não é avaliada; o valor retornado é que o objeto estático bytecount.
Membros de dados estáticos estão sujeitos às regras de acesso de membro de classe, portanto privadas de acesso a membros de dados estáticos é permitida apenas para amigos e funções de membro de classe.Essas regras são descritas na O controle de acesso de membro.A exceção é que os membros devem ser definidos no escopo do arquivo independentemente de suas restrições de acesso de dados estáticos.Se o membro de dados deve ser inicializados explicitamente, um inicializador deve ser fornecido com a definição.
O tipo de membro estático não é qualificado pelo seu nome de classe.Portanto, o tipo de BufferedOutput::bytecount é long.