Entendendo Classes de Armazenamento em C++: Escopo, Tempo de Vida e Uso
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 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
A classe de armazenamento auto é 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 register
A classe de armazenamento register é usada para definir variáveis locais que devem ser armazenadas em um registrador em vez de RAM. Isso significa que a variável tem tamanho máximo igual ao tamanho do registrador (geralmente uma palavra) e não pode ter o operador unário '&' aplicado a ela (já que não tem localização de memória).
{
register int miles;
}
O register só deve ser usado para variáveis que requerem acesso rápido, como contadores. Também deve ser notado que definir 'register' não significa que a variável será armazenada em um registrador. Significa que ela PODE ser armazenada em um registrador dependendo de restrições de hardware e implementação.
A Classe de Armazenamento static
A classe de armazenamento static instrui o compilador a manter uma variável local em existência durante o tempo de vida do programa, em vez de criá-la e destruí-la cada vez que entra e sai do escopo. Portanto, tornar variáveis locais static permite que elas mantenham seus valores entre chamadas de função.
O modificador static também pode ser aplicado a variáveis globais. Quando isso é feito, faz com que o escopo dessa variável seja restrito ao arquivo em que é declarada.
Em C++, quando static é usado em um membro de dados de classe, faz com que apenas uma cópia desse membro seja compartilhada por todos os objetos de sua classe.
#include <iostream>
// Declaração de função
void func(void);
static int count = 10; /* Variável global */
main() {
while(count--) {
func();
}
return 0;
}
// Definição de função
void func(void) {
static int i = 5; // variável local static
i++;
std::cout << "i is " << i;
std::cout << " and count is " << count << std::endl;
}
Quando o código acima é compilado e executado, 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 extern
A classe de armazenamento extern é usada para dar uma referência de uma variável global que é visível a TODOS os arquivos do programa. Quando você usa 'extern', a variável não pode ser inicializada, pois tudo o que faz é apontar o nome da variável para uma localização de armazenamento que foi definida anteriormente.
Quando você tem múltiplos arquivos e define uma variável global ou função que será usada em outros arquivos também, então extern será usado em outro arquivo para dar referência da variável ou função definida. Apenas para entendimento, extern é usado para declarar uma variável global ou função em outro arquivo.
O modificador extern é mais comumente usado quando há dois ou mais arquivos compartilhando as mesmas variáveis globais ou funções, como 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 count em outro arquivo. Agora compile estes dois arquivos da seguinte forma:
$g++ main.cpp support.cpp -o write
Isso produzirá o programa executável write; tente executar write e verifique o resultado:
$./write 5
A Classe de Armazenamento mutable
O especificador mutable aplica-se apenas a objetos de classe, que são discutidos mais adiante neste tutorial. Ele permite que um membro de um objeto sobrescreva uma função membro const. Ou seja, um membro mutable pode ser modificado por uma função membro const.
Linguagem C
- Dominando Operadores em C++: Guia Completo com Exemplos Práticos
- Classes e Objetos em C++: Guia Prático de Programação Orientada a Objetos
- Funções Amigas e Classes Amigas em C++: Dominando o Controle de Acesso
- Dominando Templates de Classe em C++: Um Guia Prático
- Entendendo Classes de Armazenamento em C: Escopo, Tempo de Vida e Performance
- Entendendo Classes de Armazenamento em C: Escopo, Tempo de Vida e Uso
- Entendendo Polimorfismo em C++: Guia Prático
- Dominando Abstração de Dados em C++: Simplifique Design com Separação Interface-Implementação
- Encapsulamento de Dados em C++: Proteja Seu Código
- Interfaces em C++: Dominando Classes Abstratas e Funções Virtuais Puras