Operador de inicialización

El símbolo = también se usa como operador para inicializar las variables.

int num = 5;

Como hemos comentado, el operador = es un operador sobrecargado y es interesante conocer la diferencia cuando se usa para asignar de cuando se utiliza para inicializar. Aunque el resultado final almacenado en la variable sea el mismo, la CPU necesitará hacer operaciones distintas para cada uno de los operadores.

La sentencia

int num = 5; // Inicialización por copia

es distinta que:

int num; // Variable sin inicializar
num = 5; // Asignación del valor 5 a num

Es cierto que para el caso de los tipos de datos básicos (int, double, etc.), ambas secuencias de sentencias producen el mismo resultado, pero para tipos de datos más complejos esto no es así.

Una primera gran diferencia: se inicializa una única vez; se asigna cuantas veces sea necesario.

Diferencia entre inicializar y asignar

Para entender mejor la diferencia veamos el siguiente símil.

Supongamos un problema en el cual tenemos un contenedor con cubos de colores blanco y negro (cada cubo representaría un bit: 0 o 1).

Pedimos a una persona (CPU) que construya una torre (el tipo de dato) con cierto número de cubos sobre una mesa (la memoria).

Las únicas operaciones permitidas son las de una pila:

  • apilar: coger un cubo y depositarlo sobre la torre

  • desapilar: coger el cubo superior de la torre y dejarlo en el contenedor

Arranca el programa. La mesa está vacía. Tenemos 3 sentencias.

  • 1ª sentencia: inicialización: formar una torre con 3 cubos blancos.

    El proceso consiste en buscar un cubo blanco, cogerlo, dejarlo en cierta posición sobre la mesa (la dirección de memoria) e ir formando la torre.

  • 2ª sentencia: asignación: modificar la torre de tal forma que el cubo intermedio sea negro.

    El proceso en este caso consiste en quitar sucesivamente dos cubos blancos, coger un cubo negro del contenedor y dejarlo sobre la torre y coger un cubo blanco del contenedor y dejarlo sobre la torre.

  • 3ª sentencia: inicialización: formar una nueva torre con 2 cubos blancos y uno negro, siendo este último el intermedio.

Las 2 torres actualmente sobre la mesa (memoria) son iguales, pero la CPU ha realizado operaciones diferentes para crearlas debido a que la primera se formó por asignación (ya existía una torre ahí) y la segunda por inicialización.

Inicialización uniforme

Además de la sintaxis de incialización que hemos visto, inicialización por copia, desde el estándar C++11, se dispone de una nueva sintaxis, conocida como inicialización uniforme.

int num{5};
int num{}; // Inicializa a 0

Una ventaja de esta forma de inicialización es que deduce el tipo de las constantes literales y el compilador nos avisa de un posible error.

int x = 3.3;   // Posible aviso: trunca la parte decimal
int num{3.3};  // Error

Edita, compila y ejecuta el código

En el caso de la inicialización por copia, y dependiendo del compilador, tendremos un aviso (warning).

Aunque la sintaxis de inicialización uniforme es la recomendada, la inicialización por copia está presente en millones y millones de líneas de código por lo que la usaremos también habitualmente en el curso cuando inicialicemos variables de tipos de datos básicos.

Advertencia

Existe otra sintaxis de inicialización, llamada directa, cuyo uso está desaconsejado: int num(5);.