Un constructor por defecto es uno que puede
ser invocado sin argumentos. Un constructor por defecto se usa
para crear un «objeto vainilla»[60] pero también es importante cuando el compilador debe
crear un objeto pero no se dan detalles. Por ejemplo, si se toma
la struct
Y
definida previamente y
se usa en una definición como ésta,
Y y2[2] = { Y(1) };
el compilador se quejará porque no puede encontrar un constructor
por defecto. El segundo objeto del array se creará sin argumentos,
y es ahí donde el compilador busca un constructor por defecto. De
hecho, si simplemente define un array de objetos
Y
,
Y y3[7];
el compilador se quejará porque debería haber un constructor para inicializar cada objeto del array.
El mismo problema ocurre si crea un objeto individual como éste:
Y y4;
Recuerde, si tiene un constructor, el compilador asegura que siempre ocurrirá la construcción, sin tener en cuenta la situación.
El constructor por defecto es tan importante que si (y sólo si)
una estructura (struct
o
clase
) no tiene constructor, el compilador
creará uno automáticamente. Por ello, lo siguiente funciona:
//: C06:AutoDefaultConstructor.cpp // Automatically-generated default constructor class V { int i; // private }; // No constructor int main() { V v, v2[10]; } ///:~
Listado 6.11. C06/AutoDefaultConstructor.cpp
Si se han definido constructores, pero no hay constructor por
defecto, las instancias anteriores de V
provocarán errores durante la compilación.
Podría pensarse que el constructor sintetizado por el compilador debería hacer alguna inicialización inteligente, como poner a cero la memoria del objeto. Pero no lo hace - añadiría una sobrecarga que quedaría fuera del control del programador. Si quiere que la memoria sea inicializada a cero, debería hacerlo escribiendo un constructor por defecto explícito.
Aunque el compilador creará un constructor por defecto, el comportamiento de ese constructor raramente hará lo que se espera. Debería considerar esta característica como una red de seguridad, pero que debe usarse con moderación. En general, debería definir sus constructores explicitamente y no permitir que el compilador lo haga por usted.
[60] N.de.T: Para los anglosajones Vainilla es el sabor más «sencillo», sin adornos ni sofisticaciones.