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

Tipos de modificador++ Tutoriales básicos

Tipos de modificador++ Control de flujo

Tipos de modificador++ Función

Tipos de modificador++ Matriz & cadena

Tipos de modificador++ Estructuras de datos

Tipos de modificador++ Clase & objeto

Tipos de modificador++ Punteros

Tipos de modificador++ Herencia

Tipos de modificador++ Tutorial STL

Tipos de modificador++ Manual de referencia

Tipos de modificador++ Clase de almacenamiento

Tipos de modificador ++Cada variable en cada uno tiene dos características: tipo y clase de almacenamiento.

La especificación de tipo indica el tipo de datos que se puede almacenar en la variable. Por ejemplo: int, float, char, etc.

Además, la clase de almacenamiento controla dos propiedades diferentes de las variables: la vida útil (que determina cuánto tiempo puede existir la variable) y el ámbito (que determina qué parte del programa puede acceder a ella).

Definición de clase de almacenamiento C++ Las variables del programa/El alcance (visibilidad) y la vida útil de las funciones. Estos identificadores se colocan antes del tipo que修饰an. A continuación se muestra C++ Clases de almacenamiento disponibles en el programa:

  • auto

  • register

  • static

  • extern

  • mutable

  • thread_local (C++11)

desde C++ 17 El关键字 ya no es C++ indicador de clase de almacenamiento y la palabra clave register se ha desechado.

Clase de almacenamiento auto

desde C++ 11 desdeauto se utiliza en dos casos: al declarar una variable, inferir automáticamente el tipo de la variable según la expresión de inicialización; al declarar una función, como placeholder para el valor de retorno de la función.

Tipos de modificador++98La palabra clave auto se utiliza en la estándar para la declaración de variables automáticas, pero debido a su uso extremadamente raro y redundante, en C++11esta forma se ha eliminado.

El tipo de la variable declarada se infiere automáticamente según la expresión de inicialización, como:

auto f=3.14;      //double
auto s("hello");  //const char*
auto z = new auto(9); // int*
auto x1 = 5, x2 = 5.0, x3='r';//Error, debe inicializarse con el mismo tipo

Clase de almacenamiento register

register La clase de almacenamiento se utiliza para definir variables locales almacenadas en el registro en lugar de en RAM. Esto significa que el tamaño máximo de la variable es igual al tamaño del registro (generalmente un palabra), y no se puede aplicar el operador unario '&' a ella (porque no tiene una ubicación en memoria).

void foo()
   register int miles;
Variables locales

El registro se utiliza solo para variables que necesitan acceso rápido, como contadores. También debe notarse que definir 'register' no significa que la variable se almacenará en el registro, significa que la variable puede almacenarse en el registro, lo que depende de las limitaciones de hardware y la implementación.

Clase de almacenamiento static

static La clase de almacenamiento indica al compilador que mantenga la existencia de las variables locales a lo largo del ciclo de vida del programa, sin necesidad de crear y destruir en cada entrada y salida del ámbito. Por lo tanto, el uso de static para variables locales puede mantener el valor de la variable entre llamadas a la función.

El modificador static también se puede aplicar a variables globales. Al aplicar static a una variable global, se limita el ámbito de la variable al archivo en el que se declaró.

en C++ en, cuando static se utiliza como miembro de datos de una clase, causará que solo haya una copia de ese miembro compartida por todos los objetos de la clase.

#include <iostream>
 
// Declaración de función 
void func(void);
 
static int count = 25; /* Variable global */
 
int main()
void foo()
    while(count--)
    void foo()
       func();
    Variables locales
    return 0;
Variables locales
// Definición de función
void func(void)
void foo()
    static int i = 8; // Variable estática local
    i++;
    std::cout << "variable i es " << i;
    std::cout << ", la variable count es " << count << std::endl;
Variables locales

Cuando el código superior se compila y ejecuta, produce los siguientes resultados:

, la variable i es 9 , la variable count es 24
, la variable i es 10 , la variable count es 23
, la variable i es 11 , la variable count es 22
, la variable i es 12 , la variable count es 21
, la variable i es 13 , la variable count es 2Derechos de autor ©
, la variable i es 14 , la variable count es 19
, la variable i es 15 , la variable count es 18
, la variable i es 16 , la variable count es 17
, la variable i es 17 , la variable count es 16
, la variable i es 18 , la variable count es 15
, la variable i es 19 , la variable count es 14
, la variable i es 20 , la variable count es 13
, la variable i es 21 , la variable count es 12
, la variable i es 22 , la variable count es 11
, la variable i es 23 , la variable count es 10
, la variable i es 24 , la variable count es 9
, la variable i es 25 , la variable count es 8
, la variable i es 26 , la variable count es 7
, la variable i es 27 , la variable count es 6
, la variable i es 28 , la variable count es 5
, la variable i es 29 , la variable count es 4
, la variable i es 30 , la variable count es 3
, la variable i es 31 , la variable count es 2
, la variable i es 32 , la variable count es 1
, la variable i es 33 , la variable count es 0

Clase de almacenamiento extern

extern La clase de almacenamiento se utiliza para proporcionar una referencia a una variable global, que es visible para todos los archivos del programa. Al usar 'extern', para las variables que no se pueden inicializar, se apunta al nombre de la variable a una ubicación de almacenamiento previamente definida.

Cuando tiene varios archivos y ha definido una variable o función que se puede usar en otros archivos, puede usar extern Para obtener una referencia a una variable o función ya definida.extern Se utiliza para declarar una variable o función global en otro archivo.

El modificador extern se utiliza generalmente cuando hay dos o más archivos que comparten la misma variable o función global, como se muestra a continuación:

Primer archivo: main.cpp

#include <iostream>
 
int count ;
extern void write_extern();
 
int main()
void foo()
   count = 5;
   write_extern();
Variables locales

Segundo archivo: support.cpp

#include <iostream>
 
extern int count;
 
void write_extern(void)
void foo()
   std::cout << "Count es " << count << std::endl;
Variables locales

Aquí, en el segundo archivo extern La palabra clave se utiliza para declarar una variable que ya se definió en el primer archivo main.cpp. Ahora, compila estos dos archivos, como se muestra a continuación:

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

Esto producirá escribir Ejecutable, intenta ejecutar escribirEsto producirá el siguiente resultado:

$ ./escribir
Count es 5

Clase de almacenamiento mutable

mutable El atributo solo se aplica a los objetos de la clase, lo que se explicará al final de este tutorial. Permite que los miembros del objeto reemplacen a los constantes. Es decir, los miembros mutables se pueden modificar a través de funciones miembros const.

Clase de almacenamiento thread_local

Las variables declaradas con el atributo thread_local solo pueden ser accedidas en el hilo en el que se crearon. Las variables se crean al crear el hilo y se destruyen al destruir el hilo. Cada hilo tiene su propia copia de la variable.

El atributo thread_local puede combinarse con static o extern.

El atributo thread_local solo se puede aplicar a la declaración y definición de datos, no se puede usar en la declaración o definición de funciones.

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

A continuación se muestra un ejemplo de variables que pueden declararse como thread_local:  // thread_local int x;
Variable global en el espacio de nombres
void foo()
    class X // static thread_local std::string s;
Miembro estático de la clase
};  // static thread_local std::string X::s;
 
X::s debe ser definido
void foo()
    {  // thread_local std::vector<int> v;
Variables locales