English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Tipos de Modificadores++ Tutoriais Básicos

Tipos de Modificadores++ Controle de fluxo

Tipos de Modificadores++ Função

Tipos de Modificadores++ Array & string

Tipos de Modificadores++ Estrutura de dados

Tipos de Modificadores++ Classe & objeto

Tipos de Modificadores++ Ponteiro

Tipos de Modificadores++ Herança

Tipos de Modificadores++ Tutorial STL

Tipos de Modificadores++ Manual de referência

Tipos de Modificadores++ Classe de armazenamento

Tipos de Modificadores ++Cada variável no C tem duas características: tipo e classe de armazenamento.

A especificação do tipo pode armazenar o tipo de dados que podem ser armazenados na variável. Por exemplo: int, float, char, etc.

Além disso, a classe de armazenamento controla duas propriedades diferentes das variáveis: o ciclo de vida (determina por quanto tempo a variável pode existir) e o escopo (determina qual parte do programa pode acessá-la).

Definição da classe de armazenamento C++ Variáveis no programa/O escopo (visibilidade) da função e o ciclo de vida. Esses identificadores são colocados antes do tipo que eles modificam. A seguir está C++ Classe de armazenamento disponível no programa:

  • auto

  • register

  • static

  • extern

  • mutable

  • thread_local (C++11)

A partir do C++ 17 No mais, a palavra-chave auto não é C++ indicador de classe de armazenamento e a palavra-chave register foi descontinuada.

classe de armazenamento auto

a partir de C++ 11 desdeauto a palavra-chave é usada em duas situações: ao declarar uma variável, inferindo automaticamente o tipo da variável com base na expressão de inicialização; ao declarar uma função, como marcador de placeholder para o valor de retorno da função.

Tipos de Modificadores++98a palavra-chave auto é usada no padrão para a declaração de variáveis automáticas, mas devido ao seu uso raro e redundante, no C++11esta utilização foi removida do padrão.

o tipo da variável declarada é inferido automaticamente com base na expressão de inicialização, por exemplo:

auto f=3.14;      //double
auto s("hello");  //const char*
auto z = new auto(9); // int*
auto x1 = 5, x2 = 5.0, x3='r';//erro, deve ser inicializado com o mesmo tipo

classe de armazenamento register

register A classe de armazenamento é usada para definir variáveis locais armazenadas em registradores em vez de RAM. Isso significa que o tamanho máximo da variável é igual ao tamanho do registrador (normalmente um palavra), e não pode ser aplicado o operador unário '&' a ela (porque não tem endereço de memória).

void foo()
   register int miles;
Variáveis Locais

register é usado apenas para variáveis que precisam de acesso rápido, como contadores. Também deve ser notado que a definição de 'register' não significa que a variável será armazenada em um registrador, significa que a variável pode ser armazenada em um registrador, dependendo dos limites de hardware e da implementação.

classe de armazenamento static

static A classe de armazenamento indica ao compilador para manter a existência da variável local ao longo do ciclo de vida do programa, sem a necessidade de criá-la e destruí-la a cada vez que ela entra e sai do escopo. Portanto, o uso do modificador static em variáveis locais pode manter o valor da variável entre chamadas de função.

o modificador static também pode ser aplicado a variáveis globais. Quando o static é aplicado a uma variável global, ele limita o escopo da variável ao arquivo onde foi declarada.

em C++ no, quando o static é usado como membro de dados de classe, ele causa que haja apenas uma cópia do membro para todos os objetos da classe.

#include <iostream>
 
// declaração de função 
void func(void);
 
static int count = 25; /* variável global */
 
int main()
void foo()
    while(count--)
    void foo()
       func();
    Variáveis Locais
    return 0;
Variáveis Locais
// definição de função
void func(void)
void foo()
    static int i = 8; // variável estática local
    i++;
    std::cout << "variável i é " << i;
    std::cout << ", a variável count é " << count << std::endl;
Variáveis Locais

Quando o código acima é compilado e executado, ele produz os seguintes resultados:

, a variável i é 9 , a variável count é 24
, a variável i é 10 , a variável count é 23
, a variável i é 11 , a variável count é 22
, a variável i é 12 , a variável count é 21
, a variável i é 13 , a variável count é 2Copyright ©
, a variável i é 14 , a variável count é 19
, a variável i é 15 , a variável count é 18
, a variável i é 16 , a variável count é 17
, a variável i é 17 , a variável count é 16
, a variável i é 18 , a variável count é 15
, a variável i é 19 , a variável count é 14
, a variável i é 20, a variável count é 13
, a variável i é 21 , a variável count é 12
, a variável i é 22 , a variável count é 11
, a variável i é 23 , a variável count é 10
, a variável i é 24 , a variável count é 9
, a variável i é 25 , a variável count é 8
, a variável i é 26 , a variável count é 7
, a variável i é 27 , a variável count é 6
, a variável i é 28 , a variável count é 5
, a variável i é 29 , a variável count é 4
, a variável i é 30, a variável count é 3
, a variável i é 31 , a variável count é 2
, a variável i é 32 , a variável count é 1
, a variável i é 33 , a variável count é 0

Classe de armazenamento extern

extern A classe de armazenamento é usada para fornecer uma referência para uma variável global, que é visível para todos os arquivos do programa. Quando você usa 'extern', para variáveis que não podem ser inicializadas, o nome da variável aponta para um local de armazenamento definido anteriormente.

Quando você tem vários arquivos e define uma variável ou função que pode ser usada em outros arquivos, pode usá-la em outros arquivos extern Para obter uma referência para uma variável ou função já definida. Pode ser compreendido assim,extern É usado para declarar uma variável global ou função em outro arquivo.

O especificador extern é usado geralmente quando há dois ou mais arquivos compartilhando a mesma variável global ou função, conforme mostrado a seguir:

Primeiro arquivo: main.cpp

#include <iostream>
 
int count;
extern void write_extern();
 
int main()
void foo()
   count = 5;
   write_extern();
Variáveis Locais

Segundo arquivo: support.cpp

#include <iostream>
 
extern int count;
 
void write_extern(void)
void foo()
   std::cout << "Count é " << count << std::endl;
Variáveis Locais

Aqui, no segundo arquivo, extern A palavra-chave é usada para declarar uma variável que já foi definida no primeiro arquivo main.cpp. Agora, compile esses dois arquivos, conforme mostrado a seguir:

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

Isso produzirá escrever Programa executável, tente executar escreverIsso produzirá o seguinte resultado:

$ ./escrever
Count é 5

Classe de armazenamento mutable

mutable O especificador é aplicável apenas aos objetos da classe, o que será explicado no final deste tutorial. Ele permite que os membros do objeto substituam constantes. Isso é, membros mutáveis podem ser modificados por funções membro const.

Classe de armazenamento thread_local

As variáveis declaradas com o especificador thread_local podem ser acessadas apenas na thread na qual foram criadas. A variável é criada ao criar a thread e destruída ao destruir a thread. Cada thread tem sua própria cópia de variável.

O especificador thread_local pode ser combinado com static ou extern.

thread_local pode ser aplicado apenas a declarações e definições de dados, thread_local não pode ser usado em declarações ou definições de funções.

以下演示了可以被声明为 thread_local 的变量:

A seguir, demonstra variáveis que podem ser declaradas como thread_local:  // thread_local int x;
Variável Global no Nome de Espaço
void foo()
    class X // static thread_local std::string s;
Membro Estático da Classe
};  // static thread_local std::string X::s;
 
X::s precisa ser definido
void foo()
    {  // thread_local std::vector<int> v;
Variáveis Locais