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);
.