Share via


Membros estáticos (C++)

As classes podem conter dados estáticos de membros e funções de membros. Quando um membro de dados é declarado como static, apenas uma cópia dos dados é mantida para todos os objetos da classe.

Os membros de dados estáticos não fazem parte dos objetos de um determinado tipo de classe. 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 da classe, mas a definição é realizada no escopo do arquivo. Esses membros estáticos têm vinculaçã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 deve ser definido fora de declaração da classe.

Os membros de dados estáticos podem ser mencionados sem fazer referência a um objeto do tipo da classe. O número de bytes gravados usando objetos BufferedOutput pode ser obtido da seguinte maneira:

long nBytes = BufferedOutput::bytecount;

Para que o membro estático exista, não é necessário que objetos do tipo de classe existam. Os membros estáticos também podem ser acessados usando os operadores de seleção de membros (. e ->). Por exemplo:

BufferedOutput Console;

long nBytes = Console.bytecount;

No caso anterior, a referência ao objeto (Console) não é avaliada. O valor retornado é o do objeto estático bytecount.

Os membros de dados estáticos estão sujeitos às regras de acesso do membro da classe. Portanto, o acesso particular aos membros de dados estáticos é permitido somente para funções de membro da classe e friends. Essas regras são descritas em Controle de acesso de membros. A exceção é que os membros de dados estáticos devem ser definidos no escopo de arquivo, independentemente das suas restrições de acesso. Se o membro de dados for inicializado explicitamente, um inicializador deverá ser fornecido com a definição.

O tipo de um membro estático não é qualificado por seu nome de classe. Portanto, o tipo de BufferedOutput::bytecount é long.

Confira também

Classes e Structs