Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


3.2.3 Constantes

§1 Sinopsis

La palabra constante tiene en C++ dos connotaciones sutilmente diferentes aunque relacionadas, que conviene distinguir:

§1.1 La primera es el sentido normal de la palabra constante en lenguaje natural; es decir, datos (de cualquiera de los tipos posible) cuyos valores se han definido en el momento de escribir el código del programa, y no pueden ser modificados más tarde en tiempo de ejecución (lo que significa que sus valores deben ser resueltos en tiempo de compilación). Dicho en otras palabras:  el compilador sabe cual es el valor de los objetos declarados como constantes y en base a este conocimiento puede hacer cuantas suposiciones sean válidas para conseguir la mayor eficiencia en tiempo de ejecución.

En este sentido, el concepto constante es justamente el opuesto a variable, que corresponde a aquellos objetos-dato que pueden recibir nuevas asignaciones de valor a lo largo del programa. Dicho en otras palabras: entidades cuyo valor solo es conocido en tiempo de ejecución.

§1.2 La segunda connotación es la de tipo ( 2.1) de objeto-dato. En este sentido podemos afirmar que en C++ los enteros (variables) forman un tipo distinto de los enteros constantes (constantes enteras), y que los caracteres (variables) forman un tipo distinto de las constantes carácter. Así pues, distinguimos entre un tipo char y un tipo const char. Como prácticamente todos los tipos de objeto-dato posibles en C++ puede declararse constantes, existe un universo de tipos C++, simétrico al de los tipos de objetos variables, pero de objetos constantes.

Como corolario de lo anterior, tenga en mente que, por ejemplo, un entero y una constante entera son tipos distintos y que una constante entera C++ significa algo más que un entero al que no se le puede cambiar su valor.


§2 Lo que hace el compilador con los objetos declarados inicialmente como constantes depende de la implementación. Esto significa que no está garantizado que tales objetos tengan un Lvalue ( 2.1.5).  Por ejemplo: en const int x = 5; no está garantizado que el compilador le asigne a x un Lvalue, es decir, un espacio en memoria determinado (que se permita modificar o no su valor es otra cuestión).

Puede ocurrir que, por razones de eficacia, sea simplemente una especie de "define" [1]. Una especie de nemónico que hace que el compilador lo sustituya por un 5 en cada trozo de código donde aparezca x.  Incluso en sitios donde aparezca asociada a otras constantes puede estar resuelto el valor en tiempo de compilación. Por ejemplo, si en otro sitio del programa aparece: const int z = 7; y más tarde: int w = x + z + y; puede ocurrir que el compilador establezca directamente: int w = 12 + y.

Por esta razón no está garantizado que el operador const_cast ( 4.9.9a) funcione con objetos declarados inicialmente como constantes.


§3 Como se ha indicado, en C++ existen tantos tipos de constantes como tipos de variables, pero aparte de las ya mencionadas constantes manifiestas ( 1.4.1a), solo nos detendremos en las que por una u otra razón hay cosas interesantes que puntualizar. Son las siguientes:

  • Expresiones Constantes ( 3.2.3a)
  • Constantes enteras  ( 3.2.3b)
  • Constantes fraccionarias ( 3.2.3c)
  • Constantes carácter de varios subtipos, incluyendo elementos aislados y cadenas ( 3.2.3d3.3.3h3.2.3f)
  • Enumeraciones  ( 3.2.3g)

El Estándar C++ denomina "literales" a lo que el Estándar C denomina "constantes", y establece que existen 5 tipos de estos "literales":

Constantes enteras ("Integer literal")

Constantes carácter ("Character literal")

Constantes fraccionarias ("Floating literal")

Constantes de cadena ("String literal")

Constantes lógicas ("Boolean literal").


§4 Por la forma en que están expresadas en el código pueden considerarse en dos grupos:

  • Directas si están directamente expresadas. Por ejemplo:

    const float pi = 3.14159;

  • Expresiones ( 3.2.3a) si su valor está implícito en una expresión. Por ejemplo:

    const float k = pi * 2;


§5 El tipo de dato correspondiente a una constante es deducido por el compilador en base a indicios implícitos, como el valor numérico y formato usados en el fuente. En algunos casos también por ciertos calificadores explícitos. C++ tiene una palabra específica para este fin: const ( 3.2.1c).

Ejemplos:

char c = 'X';       // X es una constante tipo char

const int X = 10;   // X es un tipo int-constante

  Inicio.


[1] De hecho, en los primitivas versiones del C de K&R, cuando se quería utilizar una constante había que utilizar un define ( 4.9.10b) en la forma:

# define PI = 3.13159;

# define G = 9.80665;

Etc.