56 - Definición de constantes (const)


Una constante es un identificador con un valor inmodificable, permanece fijo durante toda la ejecución del programa. Se las define antecediéndole la palabra reservada const. No existe una zona determinada para su declaración. Pueden ser globales o locales.

Una constante a diferencia de una macro ocupa un espacio durante la ejecución del programa.

Programa:

#include<iostream>

using namespace std;

const int inicio=1;
const float altura=1.92f;
const char mensaje1[]="Bienvenido al programa";

int main()
{
    cout << "Constante entera:" << inicio << "\n";
    cout << "Constante flotante:" << altura << "\n";
    cout << "Constante de tipo cadena de caracteres:" << mensaje1 << "\n";
    const int fin=10;
    cout << "Constante local:" << fin;
    return 0;    
}

Vemos que para definir constantes debemos anteceder la palabra clave const al nombre del tipo de dato, son constantes globales si las definimos fuera de la main y que no dependan de otra función o clase:

const int inicio=1;
const float altura=1.92f;
const char mensaje1[]="Bienvenido al programa";

Se trata de una constante local a una función cuando la definimos dentro de la misma, por ejemplo dentro de la main:

int main()
{
    cout << "Constante entera:" << inicio << "\n";
    cout << "Constante flotante:" << altura << "\n";
    cout << "Constante de tipo cadena de caracteres:" << mensaje1 << "\n";
    const int fin=10;
    cout << "Constante local:" << fin;
    return 0;    
}

Si tratamos de asignar otro valor a una constante el compilador nos generará un error sintáctico:

    const int fin=10;
    fin=0; //error

Definición de constantes dentro de una clase. Una primer forma es definir una constante estática que podemos utilizar dentro de la clase. Al ser estática todos los objetos de la clase acceden al mismo elemento en memoria:

Programa:

#include<iostream>

using namespace std;

class Vector {
    static const int tamano=5;
    int vec[tamano];
public:
    void cargar();
    void imprimir();
};

void Vector::cargar()
{
    for(int f=0;f<tamano;f++)
    {
        cout << "Ingrese elemento:";
        cin >> vec[f];
    }
}

void Vector::imprimir()
{
    for(int f=0;f<tamano;f++)
    {
        cout << vec[f] << "-";
    }
}

int main()
{
    Vector vec1;
    vec1.cargar();
    vec1.imprimir();
    return 0;
}

Com podemos observar cuando definimos la constante le antecedemos los modificadores static const. Es importante tener en cuenta que solo podemos definir constantes estáticas si se trata de valores enteros:

class Vector {
    static const int tamano=5;
    int vec[tamano];
public:
    void cargar();
    void imprimir();
};

Para definir atributos de una clase que sean constantes debemos inicializarlos por única vez en en la zona de inicialización del constructor, veamos un ejemplo:

Programa:

#include<iostream>

using namespace std;

class Temperatura {
    const int media;
    int minima,maxima;
public:
    Temperatura(int min,int max,int me);
    void imprimir();
};

Temperatura::Temperatura(int min,int max,int me):media(me)
{
    minima=min;
    maxima=max;
}

void Temperatura::imprimir()
{
    cout <<minima <<" " <<maxima <<" " << media << "\n";
}

int main()
{
    Temperatura t1(10,20,14);
    t1.imprimir();
    Temperatura t2(5,9,7);
    t2.imprimir();
    return 0;
}

Para definir un atributo de la clase constante alcanza en un principio con solo anteceder la palabra clave const:

class Temperatura {
    const int media;
    int minima,maxima;
public:
    Temperatura(int min,int max,int me);
    void imprimir();
};

No podemos asignarle un valor (no tendría sentido ya que todos los objetos de la clase tendrían el mismo valor) entonces inicializamos la constante por única vez en el constructor:

Temperatura::Temperatura(int min,int max,int me):media(me)
{
    minima=min;
    maxima=max;
}

Como vemos luego de los parámetros del constructor disponemos el nombre de la constante y entre paréntesis el valor con el que inicializamos la constante normalmente un dato que llega como parámetro al constructor.

Desde la main cuando creamos objetos de la clase Temperatura el tercer parámetro es el dato con el que se inicializa el constructor (uno con el valor 14 y el otro objeto con el valor 7):

int main()
{
    Temperatura t1(10,20,14);
    t1.imprimir();
    Temperatura t2(5,9,7);
    t2.imprimir();
    return 0;
}

Si la clase tiene que inicializar más de una constante no estática la sintaxis en el constructor quedaría (con dos constantes):

Temperatura::Temperatura(int min,int max,int me,int valor2):media(me),constante2(valor2)

Retornar