Classes de armazenamento em C ++

Uma classe de armazenamento define o escopo (visibilidade) e o tempo de vida de variáveis ​​e / ou funções dentro de um Programa C ++. Esses especificadores precedem o tipo que eles modificam. Existem as seguintes classes de armazenamento, que podem ser usadas em um programa C ++

  • auto
  • register
  • static
  • extern
  • mutable

A classe de armazenamento auto

o auto classe de armazenamento é a classe de armazenamento padrão para todas as variáveis ​​locais.

{
   int mount;
   auto int month;
}

O exemplo acima define duas variáveis ​​com a mesma classe de armazenamento, auto só pode ser usado dentro de funções, ou seja, variáveis ​​locais.

A classe de armazenamento registrada

o registerA classe de armazenamento é usada para definir variáveis ​​locais que devem ser armazenadas em um registro em vez de na RAM. Isso significa que a variável tem um tamanho máximo igual ao tamanho do registrador (geralmente uma palavra) e não pode ter o operador unário '&' aplicado a ela (pois não tem uma localização na memória).

{
   register int  miles;
}

O registro deve ser usado apenas para variáveis ​​que requerem acesso rápido, como contadores. Deve-se notar também que definir 'registro' não significa que a variável será armazenada em um registro. Isso significa que PODE ser armazenado em um registro dependendo do hardware e das restrições de implementação.

A classe de armazenamento estática

o staticA classe de armazenamento instrui o compilador a manter uma variável local existente durante o tempo de vida do programa, em vez de criá-la e destruí-la toda vez que ela entrar e sair do escopo. Portanto, tornar as variáveis ​​locais estáticas permite que eles mantenham seus valores entre as chamadas de função.

O modificador estático também pode ser aplicado a variáveis ​​globais. Quando isso é feito, o escopo da variável fica restrito ao arquivo no qual ela foi declarada.

Em C ++, quando estático é usado em um membro de dados de classe, ele faz com que apenas uma cópia desse membro seja compartilhada por todos os objetos de sua classe.

#include <iostream>
 
// Function declaration
void func(void);
 
static int count = 10; /* Global variable */
 
main() {
   while(count--) {
      func();
   }
   
   return 0;
}

// Function definition
void func( void ) {
   static int i = 5; // local static variable
   i++;
   std::cout << "i is " << i ;
   std::cout << " and count is " << count << std::endl;
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

i is 6 and count is 9
i is 7 and count is 8
i is 8 and count is 7
i is 9 and count is 6
i is 10 and count is 5
i is 11 and count is 4
i is 12 and count is 3
i is 13 and count is 2
i is 14 and count is 1
i is 15 and count is 0

A classe de armazenamento externa

o externA classe de armazenamento é usada para fornecer uma referência de uma variável global que é visível para TODOS os arquivos de programa. Quando você usa 'extern', a variável não pode ser inicializada, pois tudo o que ela faz é apontar o nome da variável para um local de armazenamento que foi definido anteriormente.

Quando você tem vários arquivos e define uma variável ou função global, que será usada em outros arquivos também, extern será usado em outro arquivo para dar referência à variável ou função definida. Apenas para entender, extern é usado para declarar uma variável global ou função em outro arquivo.

O modificador externo é mais comumente usado quando há dois ou mais arquivos compartilhando as mesmas variáveis ​​globais ou funções conforme explicado abaixo.

Primeiro arquivo: main.cpp

#include <iostream>
int count ;
extern void write_extern();
 
main() {
   count = 5;
   write_extern();
}

Segundo arquivo: support.cpp

#include <iostream>

extern int count;

void write_extern(void) {
   std::cout << "Count is " << count << std::endl;
}

Aqui, a palavra-chave extern está sendo usada para declarar a contagem em outro arquivo. Agora compile esses dois arquivos da seguinte forma -

$g++ main.cpp support.cpp -o write

Isso vai produzir write programa executável, tente executar write e verifique o resultado da seguinte forma -

$./write
5

A classe de armazenamento mutável

o mutableespecificador se aplica apenas a objetos de classe, que são discutidos posteriormente neste tutorial. Ele permite que um membro de um objeto substitua a função de membro const. Ou seja, um membro mutável pode ser modificado por uma função de membro const.