OBJETOS Y FUNCIONES
MIEMBRO CONST
En ocasiones, se
debe evitar que los objetos puedan ser modificados, ya sea voluntariamente o
por accidente. Además, los intentos de modificar un objeto, función o variable
constante, se atrapan en tiempo de compilación. Con la palabra clave const, se
especifica que un objeto, función o variable no puede ser modificada. Por
ejemplo, la instrucción:
const Vertice angulo(45);
Declara un
objeto const angulo, de la clase Vertice y lo inicia con el valor 45.
Declarar
variables y objetos const, ayuda a mejorar el rendimiento, debido a que los
compiladores optimizadores, pueden realizar ciertas tareas de rendimiento sobre
las constantes, cosa que no pueden hacer sobre las que no lo son.
Hasta aquí, la
teoría está bien, pero existe un problema que puede ocurrir con los
constructores (o destructores) y es que un constructor al inicializar por
ejemplo una variable, ésta debe ser modificada (para poder inicializarse), pero
si la variable es const, entonces se producirá un error de compilación. Por
ejemplo, vamos a ver el siguiente código:
#include<iostream>
using std::cout;
class Ejemplo{
public:
Ejemplo(){
numero = 0;
}
void imprimir(){
cout << "El valor a imprimir
es: " << numero;
}
private:
const int numero;
};
int main(){
Ejemplo prueba;
prueba.imprimir();
return 0;
}
Podemos ver que el constructor de la clase Ejemplo,
está inicializando la variable numero (numero = 0), que es una constante. Si trato
de compilar el código, me arroja el siguiente error (en mi compilador)
Para solucionar este pequeño inconveniente, se
utiliza lo que se conoce como inicializador de miembros.
El inicializador de miembros, puede inicializar todos los datos miembro, pero
los datos constantes deben
inicializarse de esta manera. Además de que al utilizar la herencia (lo que se
verá más adelante) también se utiliza el inicializador de miembros.
El inicializador, consiste en colocar dos puntos ( : )
luego del cierre de paréntesis del argumento del constructor (y antes de la
apertura de llaves { ). Luego de los dos puntos, se debe poner el nombre de la
variable, seguida del valor que la va a inicializar, el cual debe ir encerrada
entre paréntesis. Esto quizás suene un poco enredado, pero en la práctica es
muy sencillo, veamos como corregir el error del programa anterior.
Para corregir el problema, se debe modificar el
constructor, el cual debe llevar el inicializador de miembros de esta manera:
Ejemplo():numero(0){
//cuerpo vacio (en este caso)
}
Como se puede apreciar, luego de los dos puntos, se
agregó la variable y luego el valor que la iniciará, quedando el cuerpo de las
llaves vacío.
No es necesario que los puntos queden exactamente al
lado del constructor, también puede quedar bajo este:
Ejemplo()
:numero(0){
//cuerpo vacio (en este caso)
}
Ejemplo()
:numero(0){}
Ejemplo()
:numero(0)
{}
Si tuviese más valores que inicializar, estos se deben separar de una
coma.
Ejemplo()
:numero(0),
edad(20), otraEdad(15)
{}
Si el constructor lleva argumentos, estos se deben inicializar de la
siguiente manera:
Ejemplo(arg1,
arg2)
:var1(arg1),
var2(arg2)
{}
Espero se entienda. Saludos.
Gustavo J.
Cerda Nilo. Junio 2018