martes, 19 de junio de 2018

C++ Inicializador de miembros


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.
https://codigogx.blogspot.com/2018/06/c-destructores.html



Gustavo J. Cerda Nilo. Junio 2018
 


No hay comentarios:

Publicar un comentario

C++ El apuntador This

El apuntador This En C++, cada objeto tiene acceso a su propia dirección a través de un puntero o apuntador denominado This. Lo...