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