Entendendo Membros Estáticos
Tags: oop, cpp, programming, beginners
Published: 2023-08-18 13:47:02

## Contextualizando o acesso aos membros

Ao gerenciar informações de um estoque, é comum a coleta de dados essenciais como nome dos produtos, quantidades e valores. Ao desenvolver uma classe dedicada a essa finalidade, incorporamos membros específicos para cada conjunto de dados que desejamos armazenar. Demonstraremos esse processo por meio de um exemplo prático: a criação de uma aplicação em C++ para gerenciar um estoque de eletrônicos. Nessa aplicação, os detalhes pertinentes aos eletrônicos serão registrados e coletados através de um construtor dedicado, atribuindo seu respectivo nome, quantidade, valor, e atualizando os dados do estoque geral de acordo com as entradas.

```c++
class EstoqueEletronicos{
      private:
      string nome;
      int quantidade;
      int valor;

      int variedadeProdutos = 0;
      int estoqueTotal = 0;
      float gasto = 0;

      public:
      EstoqueEletronicos(string Nome, int Quantidade, int Valor)
      {
          /*construtor para atribuir as informações aos membros 
          privados da classe*/
          
          this->nome = Nome;
          this->quantidade = Quantidade;
          this->valor = valor;

          variedadeProdutos++;
          estoqueTotal += quantidade;
          gasto = valor * quantidade;
      }
};
```

Quando quisermos acessar os respectivos dados da classe, como a classe criada acima, precisaremos criar objetos que trabalham como "intermediários", para que possamos trabalhar em seus membros:

```c++
EstoqueEletronicos item1("Celular", 50, 1000);
EstoqueEletronicos item2("Notebook", 20, 3500);
```

No trecho acima, criamos 2 objetos específicos (item1, item2) para 2 itens que vamos armazenar no estoque, dentro da classe.


##O que são membros estáticos e por que usar?


Antes de dizer o que são membros estáticos, devemos perceber o que está de fato acontecendo nos códigos acima. Notem que criamos dois objetos para armazenar dois itens no estoque, no entanto, essa maneira de armazenamento de dados para esse caso é ineficiente. Para entender melhor, a imagem abaixo mostrará o que acontece na memória: 


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73t3r306shm0f4zlgzdo.png)

Nesse método de armazenamento, estamos criando separadamente dois estoques para itens diferentes, o que é ineficiente, porque normalmente há apenas um estoque para todos os itens. Em vez disso, precisamos encontrar uma maneira de compartilhar e reutilizar um único estoque para todos os produtos, de forma que fique assim:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/618kd10htlah7zwslx7h.png)

Para isso, usaremos os membros estáticos, que nos permitem acessar e manipular dados de uma classe sem a necessidade de atribuir um objeto. Ou seja, independente de quantas coisas armazenamos, o estoque seguirá sendo apenas um. Para utilizar esses membros, usamos a palavra-chave **Static**.
Vejamos como aplicar isso em nosso código:

```c++
class EstoqueEletronicos{
      private:
      string nome;
      int quantidade;
      int valor;

      /*utilizando a palavra-chave 'Static' para 
      informações do estoque*/
      static int variedadeProdutos++;
      static int estoqueTotal += quantidade;
      static float gasto = quantiade * valor;

      public:
      EstoqueEletronicos(string Nome, int Quantidade, int Valor)
      {  
          this->nome = Nome;
          this->quantidade = Quantidade;
          this->valor = valor;

          variedadeProdutos++;
          estoqueTotal += quantidade;
          gasto = valor * quantidade;
      }
};
```

Assim como mudamos a forma de criação de informações para membros estáticos, sua forma de acesso também é alterada, já que não precisamos de criação de objeto para isso. Usamos o tipo do objeto, o nome da classe junto de dois "dois-pontos" (::), mais o nome do membro estático. Como exemplo, inicializaremos o estoque em 0 fora da classe para impedir que os números sejam resetados sempre que o construtor é chamado: 

```c++

int EstoqueEletronicos::variedadeProdutos = 0;
int EstoqueEletronicos::quantidade = 0;
int EstoqueEletronicos:: gasto = 0;

```

##Como devo usar os membros estáticos?

Por não haver uma criação de objetos específicos para membros estáticos, podemos somente manipular esses dados com outros membros estáticos. Suponhamos que queremos criar um método para exibir os números do estoque, para que isso seja possível, também usaremos a palavra-chave **Static** em nossa função:

```c++
static void mostrar()
     {
      cout << "Variedade de produtos: " << variedadeProdutos << endl;
        cout << "Estoque total: " << estoqueTotal << endl; 
        cout << "Gasto total: " << gasto << endl;
}
```

Apesar do método acima ser estático, é possível criar objetos temporários dentro do mesmo, para lidarmos com membros não-estáticos, mas precisamos entender que esses objetos temporários não afetam os dados já existentes e armazenados na classe.