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
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários