Compartilhar via


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.

Consulte também

Referência

Classes, estruturas e uniões