Clases de almacenamiento de una variable

Por defecto, todas las variables llevan asociada una clase de almacenamiento que determina su accesibilidad y existencia. Los conceptos de accesibilidad y de existencia de las variables pueden alterarse por los calificadores:

  • auto (obsoleto).- Es la clase de almacenamiento por defecto. El tipo y la duración de la variable se determinan automáticamente según el contexto en el que se declara. A partir de C++17, se considera depredado y se recomienda utilizar explícitamente las otras clases de almacenamiento.

Aquí tienes un ejemplo de cómo utilizar auto en C++:

En este ejemplo, utilizamos auto para deducir automáticamente el tipo de las variables number y name. En el caso de number, se deduce como int debido a la inicialización con el valor entero 10. En el caso de name, se deduce como const char* debido a la inicialización con una cadena de caracteres.

También utilizamos auto en un bucle for para iterar sobre los elementos de un vecto

r. El tipo de la variable it se deduce automáticamente como std::vector<int>::iterator, que es el tipo del iterador del vector.

La utilización de auto en estos casos puede simplificar la escritura del código y hacerlo más conciso, especialmente cuando el tipo de la variable es complejo o está implícito. Sin embargo, es importante utilizar auto con cuidado y asegurarse de que el tipo deducido es el esperado, ya que puede llevar a comportamientos inesperados si no se tiene en cuenta adecuadamente.

  • static.- La variable se almacena en la memoria estática y mantiene su valor incluso fuera del ámbito donde se declara. La duración de una variable estática es la duración de todo el programa. Si una variable estática se declara dentro de una función, su alcance será local a esa función.

Aquí tienes un ejemplo de cómo utilizar static en C++:

En este ejemplo, utilizamos la clase de almacenamiento static para crear una variable counter dentro de la función increment().

La palabra clave static le otorga a la variable counter una duración de programa, lo que significa que mantiene su valor entre llamadas sucesivas a la función increment(). Además, la variable counter es local a la función increment(), lo que significa que no es visible ni accesible desde otras funciones.

Dentro del bucle for en la función main(), llamamos a la función increment() cinco veces. Cada vez que se llama a increment(), se incrementa el valor de la variable counter y se muestra por pantalla. Debido a que counter es una variable estática, conserva su valor entre las llamadas, y el resultado es que se muestra un contador creciente en cada iteración.

La clase de almacenamiento static es útil cuando se desea mantener el valor de una variable entre llamadas a una función o cuando se necesita una variable que sea compartida entre varias llamadas a una función sin tener que utilizar una variable global.

Es importante tener en cuenta que la inicialización de una variable estática local ocurre solo en la primera ejecución de la función y que su vida útil dura durante toda la ejecución del programa. Además, el ámbito de la variable estática se limita a la función en la que se declara.

  • extern.- Se utiliza para declarar una variable global que se define en otro archivo fuente. Indica que la variable está definida en otro lugar y que se puede utilizar en el archivo actual.

Aquí tienes un ejemplo de cómo utilizar la palabra clave extern en C++:

Sean los archivos: «archivo1.cpp«:

y «archivo2.cpp«:

En este ejemplo, utilizamos la palabra clave extern para declarar una variable global llamada globalVariable en «archivo1.cpp«. Esta declaración indica que la definición de la variable se encuentra en otro archivo, en este caso, «archivo2.cpp«.

En «archivo2.cpp«, definimos la variable globalVariable sin la palabra clave extern. Esto proporciona la definición real de la variable.

En el archivo «archivo1.cpp«, podemos acceder a la variable globalVariable y asignarle un valor. Al ejecutar el programa, verás que se muestra el valor de globalVariable tanto desde «archivo1.cpp» como desde «archivo2.cpp«.

La utilización de extern nos permite compartir variables entre diferentes archivos fuente en un programa C++. Esto es útil cuando queremos utilizar una variable global definida en un archivo fuente en otro archivo sin tener que definirla nuevamente. Además, el uso de extern nos proporciona una forma de modularizar nuestro código, ya que podemos separar la declaración y la definición de las variables globales en diferentes archivos.

Es importante destacar que la declaración extern solo indica la existencia de una variable global en otro archivo y no asigna un espacio de almacenamiento para la misma. La definición de la variable, que asigna un espacio de almacenamiento, debe hacerse en otro lugar, como se muestra en «archivo2.cpp» en este ejemplo.

Al utilizar extern, podemos acceder a una variable global desde cualquier archivo fuente donde se haya declarado, lo que facilita el reuso de código y la organización de proyectos más grandes. Esto nos permite dividir nuestro programa en módulos más pequeños y mantener una estructura más clara y mantenible.

En resumen, si bien el uso de variables globales es posible y en ocasiones puede ser necesario, se recomienda limitar su uso y considerar alternativas como la encapsulación de datos y el uso de interfaces bien definidas. Esto ayuda a mejorar la estructura, modularidad y mantenibilidad de nuestro código en el largo plazo.

register (obsoleto).- Indica que la variable debe ser almacenada en un registro del procesador, si está disponible. Sin embargo, esta clase de almacenamiento se considera obsoleta desde C++17 y se ha eliminado en C++20.

En C++, la palabra clave «register» se utilizaba anteriormente para sugerir al compilador que almacenara la variable en un registro de la CPU para acceder a ella de manera más rápida. Sin embargo, a partir de C++11, la palabra clave «register» se ha vuelto obsoleta y su uso no tiene ningún efecto real en la mayoría de los compiladores modernos.

No obstante, aquí tienes un ejemplo de cómo se utilizaría la palabra clave «register» en C++:

En este ejemplo, se declara una variable llamada «x» utilizando la palabra clave «register«. Sin embargo, ten en cuenta que los compiladores modernos ignorarán esta sugerencia y tratarán la variable de la misma manera que si no se hubiera utilizado la palabra clave «register«.

Evaluación de las variables globales

En C++, las variables globales son aquellas que se declaran fuera de cualquier función, lo que significa que están disponibles en todo el programa y su vida útil abarca todo el tiempo de ejecución del programa. No existe una evaluación específica para las variables globales, ya que su comportamiento es el estándar.

Aquí tienes un ejemplo de declaración y uso de una variable global en C++:

En este ejemplo, se declara una variable global llamada «globalVariable» fuera de cualquier función. Esta variable es accesible en todo el programa, incluyendo tanto la función main() como la función myFunction(). Puedes acceder y modificar el valor de la variable global desde cualquier parte del programa.

Es importante tener cuidado al usar variables globales, ya que pueden dificultar el mantenimiento y la comprensión del código. Se recomienda utilizar variables locales en función de las necesidades del programa y mantener el alcance de las variables lo más limitado posible.

Evaluación de las variables locales

En C++, las variables locales no tienen una evaluación específica como en el caso de «register«. Las variables locales se declaran dentro de un bloque de código, como una función o un bloque de control, y su vida útil está limitada al ámbito en el que se declaran.

Aquí tienes un ejemplo de declaración y uso de una variable local en C++:

En este ejemplo, se declara una variable local llamada «x» dentro de la función myFunction(). Esta variable solo es accesible dentro del ámbito de la función y se destruye automáticamente cuando la función termina su ejecución.

Es importante destacar que las variables locales pueden tener diferentes calificaciones de almacenamiento, como «automática» (que es la calificación por defecto) o «estática«, que controla la vida útil y el alcance de la variable. Sin embargo, estas calificaciones se aplican automáticamente según las reglas del lenguaje y no requieren una especificación explícita al declarar la variable local.