C ++

Calificadores de C ++ y especificadores de clases de almacenamiento

Calificadores de C ++ y especificadores de clases de almacenamiento

CV son las siglas de Constant-Vollatile. La declaración de un objeto que no está precedido por const y / o volátil es un tipo cv-no calificado. Por otro lado, la declaración de un objeto precedido por const y / o volatile es un tipo calificado por cv. Si un objeto se declara constante, el valor en su ubicación no se puede cambiar. Una variable volátil es una variable cuyo valor está bajo la influencia del programador y, por lo tanto, el compilador no puede cambiarlo.Los especificadores de clase de almacenamiento se refieren a la vida, el lugar y la forma en que existe un tipo. Los especificadores de clase de almacenamiento son estáticos, mutables, thread_local y extern.

Este artículo explica los calificadores de C ++ y los especificadores de clase de almacenamiento. Por lo tanto, algunos conocimientos preliminares en C ++ son útiles para apreciar realmente el artículo.

Contenido del artículo:

Calificadores:

constante

Un objeto declarado constante es un objeto cuyo almacenamiento (ubicación) no se puede cambiar. Por ejemplo, en la declaración:

int const theInt = 5;

El valor de 5 en el almacenamiento para el Int no se puede cambiar.

volátil

Considere la siguiente declaración:

int portVal = 26904873;

Los compiladores a veces interfieren con el valor de una variable con la esperanza de optimizar el programa. El compilador puede mantener el valor de una variable como constante cuando no se supone que sea constante. El compilador puede interferir con los valores de objeto que tienen que ver con puertos IO asignados en memoria o con las rutinas de servicio de interrupción de dispositivos periféricos. Para evitar tal interferencia, convierta la variable en volátil, como:

int volatile portVal;
portVal = 26904873;
o como:
int volatile portVal = 26904873;

Combinando constante y volátil:

const y volatile pueden aparecer en una declaración de la siguiente manera:

int const volatile portVal = 26904873;

calificadores-cv

Una variable precedida de constante y / o volátil es un tipo calificado de cv. Una variable no precedida por constante o volátil o ambos es un tipo cv-no calificado.

Ordenar:

Un tipo puede estar más calificado para cv que otro:

Aún no se ha concluido si constante y volátil son del mismo rango.

Matriz y objeto instanciado:

Cuando una matriz se declara constante, como en la siguiente declaración, significa que el valor de cada elemento de la matriz no se puede cambiar:

const char arr [] = 'a', 'b', 'c', 'd';

Ya sea una 'a', 'b', 'c' o 'd', aún no se puede cambiar a otro valor (carácter).

Se aplica una situación similar a un objeto instanciado de una clase. Considere el siguiente programa:

#incluir
usando el espacio de nombres std;
clase Cla

público:
char ch0 = 'a';
char ch1 = 'b';
char ch2 = 'c';
char ch3 = 'd';
;
int main ()

const Cla obj;
return 0;

Debido a la declaración "const Cla obj;" con const en la función main (), ni 'a' ni 'b' ni 'c' ni 'd' se pueden cambiar a algún otro valor.

Especificadores de clase de almacenamiento:

Los especificadores de clase de almacenamiento son estáticos, mutables, thread_local y extern.

La Especificador de clase de almacenamiento estático

El especificador de clase de almacenamiento estático permite que la variable viva después de que su alcance haya pasado, pero no se puede acceder a ella directamente.

El siguiente programa ilustra esto, con una función recursiva:

#incluir
usando el espacio de nombres std;
int funct ()

static int stac = 10;
cout << stac < 50)

cout << '\n';
return 0;

funct ();

int main ()

funct ();
return 0;

La salida es:

10 20 30 40 50

Si una variable estática no se inicializa en su primera declaración, asume el valor predeterminado para su tipo.

El especificador estático también se puede utilizar con miembros de una clase; el uso aquí es diferente. Aquí, permite acceder al miembro sin instanciar el objeto.

El siguiente programa ilustra esto para un miembro de datos:

#incluir
usando el espacio de nombres std;
clase Cla

público:
estática const int num = 8;
;
int main ()

cout << Cla::num << '\n';
return 0;

La salida es:

8

El miembro de datos estáticos debe ser constante. Tenga en cuenta que el uso del operador de resolución de alcance para acceder a la variable estática fuera de su alcance (en la función principal).

El siguiente programa ilustra el uso de "estática" para una función miembro:

#incluir
usando el espacio de nombres std;
clase Cla

público:
método de vacío estático ()

cout << "Of static member function!" << '\n';

;
int main ()

Cla :: método ();
return 0;

La salida es:

De función miembro estática!

Tenga en cuenta que el uso del operador de resolución de alcance para acceder a la función de miembro estático fuera de su alcance (en la función principal).

El especificador mutable

Recuerde, desde arriba, que si un objeto instanciado comienza con const, el valor de cualquiera de sus miembros de datos normales no se puede cambiar. Y para que se cambie cualquier miembro de datos, debe declararse mutable.

El siguiente programa ilustra esto:

#incluir
usando el espacio de nombres std;
clase Cla

público:
char ch0 = 'a';
char ch1 = 'b';
char mutable ch2 = 'c';
char ch3 = 'd';
;
int main ()

const Cla obj;
obj.ch2 = 'z';
cout << obj.ch0 << " << obj.ch1 << " << obj.ch2 << " << obj.ch3 << " << '\n';
return 0;

La salida es:

'a "b" z "d'

El especificador thread_local

En la ejecución normal de un programa, se ejecuta un segmento de código, luego el siguiente segmento de código, seguido de otro segmento de código después de eso, y así sucesivamente. Ese es un hilo; el hilo principal. Si dos segmentos de código se ejecutan al mismo tiempo (misma duración), entonces se necesita un segundo hilo. El resultado del segundo hilo incluso puede estar listo antes que el hilo principal.

La función main () es como el hilo principal. Un programa puede tener más de dos subprocesos para un comportamiento asincrónico.

El segundo hilo necesita un alcance (alcance de bloque) para operar. Esto normalmente lo proporciona el alcance de la función, una función. Una variable en un alcance externo que se puede ver en el alcance del segundo hilo.

El siguiente programa corto ilustra el uso del especificador thread_local:

#incluir
#incluir
usando el espacio de nombres std;
thread_local int inter = 1;
void thread_function ()

inter = inter + 1;
cout << inter << "nd thread\n";

int main ()

hilo thr (& thread_function); // Thr comienza a correr
cout << inter << "st or main thread\n";
thr.entrar(); // el hilo principal espera el hilo, thr para terminar
return 0;

La salida es:

1er hilo o hilo principal
Segundo hilo

La variable, inter, precedida por thread_local, significa que inter tiene una instancia separada en cada hilo. Y que se puede modificar en diferentes hilos para tener diferentes valores. En este programa, se le asigna el valor 1 en el hilo principal y se modifica al valor 2 en el segundo hilo.

Un hilo necesita un objeto especial para operar. Para este programa, la biblioteca incluida por "#include "Tiene una clase llamada hilo, a partir de la cual se ha creado una instancia del objeto thr. El constructor de este objeto toma una referencia a la función del hilo como argumento. El nombre de la función de hilo en este programa es thread_function ().

La función de miembro join () para el objeto especial, en su posición empleada, hace que el subproceso principal espere a que el segundo subproceso termine de ejecutarse antes de que continúe ejecutándose, de lo contrario, la función main () puede salir sin que el (segundo) subproceso tenga dio su resultado.

El especificador externo

En términos simples, para una declaración, la memoria no se asigna para la variable o función, mientras que para una definición, la memoria se asigna. La palabra reservada externa permite que una variable o función global se declare en un archivo pero se defina en otro. Estos archivos se denominan unidades de traducción para la aplicación completa de C ++.

Escriba el siguiente programa y guárdelo con el nombre de archivo, mainFile:

#incluir
usando el espacio de nombres std;
int myInt;
const char ch;
void myFn ();
int main ()

myFn ();
return 0;

La variable, myInt, la variable constante, ch, y la función, myFn (), han sido declaradas sin estar definidas.

Escriba el siguiente programa con las definiciones y guárdelo con el nombre de archivo, otherFile, en el mismo directorio:

#incluir
usando el espacio de nombres std;
int myInt = 10;
const char ch = 'c';
anular myFn ()

cout << "myFn() says " << myInt << " and " << ch <<'\n';

Intente compilar la aplicación en la terminal (símbolo del sistema de DOS) con el siguiente comando y observe que es posible que no se compile:

g ++ archivo principal.cpp otherFile.cpp -o completo.exe

Ahora, preceda las tres declaraciones en mainFile con la palabra "extern", de la siguiente manera:

extern int myInt;
extern const char ch;
extern void myFn ();

Vuelva a guardar mainFile. Compile la aplicación con:

g ++ archivo principal.cpp otherFile.cpp -o completo.exe

(Así es como se compilan en C ++ archivos separados para la misma aplicación)

Y debería compilar. Ahora, ejecute la aplicación, complete.exe, y la salida debería ser:

myFn () dice 10 y c

Tenga en cuenta que con el uso de "extern", una variable constante puede declararse en un archivo pero definirse en otro. Cuando se trata de la declaración y definición de funciones en diferentes archivos, el uso de extern es opcional.

Cuando usar extern? Úselo cuando no tenga archivos de encabezado con declaraciones globales.

"Extern" también se usa con declaraciones de plantilla - ver más adelante.

Conclusión:

Una variable precedida de constante y / o volátil es un tipo calificado de cv. Una variable, no precedida por constante o volátil o ambos, es un tipo cv-no calificado.

Los especificadores de clase de almacenamiento son estáticos, mutables, thread_local y extern. Estos afectan la vida útil (duración), el lugar y la forma de empleo de las variables en una aplicación.

El botón de clic izquierdo del mouse no funciona en Windows 10
Si está utilizando un mouse dedicado con su computadora portátil o computadora de escritorio, pero el el botón izquierdo del mouse no funciona en Wind...
El cursor salta o se mueve aleatoriamente mientras escribe en Windows 10
Si descubre que el cursor del mouse salta o se mueve por sí solo, automáticamente, de manera aleatoria mientras escribe en una computadora portátil o ...
Cómo invertir la dirección de desplazamiento del mouse y los paneles táctiles en Windows 10
Ratón y Panel táctils no solo facilitan la informática, sino que también hacen que sea más eficiente y requieran menos tiempo. No podemos imaginar una...