La lista de inicializadores del constructor permite invocar explícitamente a los constructores de los objetos miembros. De hecho, no existe otra forma de llamar a esos constructores. La idea es que los constructores son llamados antes de la ejecución del cuerpo del constructor de la nueva clase. De esta forma, cualquier llamada que hagamos a las funciones miembros de los subobjetos siempre serán objetos inicializados. No existe otra manera de acceder al cuerpo del constructor sin que ningún constructor llame a todos los miembros objetos y los objetos de la clase base, es más, el compilador crea un constructor oculto por defecto. Esto es otra característica de C++, que garantiza que ningún objeto (o parte de un objeto) puedan estar desde un principio sin que su constructor sea llamado.
La idea de que todos los objetos miembros estén inicializados al inicio del constructor es una buena ayuda para programar. Una vez en el inicio del constructor, puede asumir que todos los subobjetos están correctamente inicializados y centrarse en las tareas que se desean realizar en el constructor. Sin embargo, existe un contratiempo: ¿Qué ocurre con los objetos predefinidos, aquellos que no tienen constructor?
Para hacer una sintaxis sólida, piense en los tipos predefinidos como si tuviesen un solo constructor, con un solo parámetro: una variable del mismo tipo como el que esta inicializando. Esto es
//: C14:PseudoConstructor.cpp class X { int i; float f; char c; char* s; public: X() : i(7), f(1.4), c('x'), s("howdy") {} }; int main() { X x; int i(100); // Applied to ordinary definition int* ip = new int(47); } ///:~
Listado 14.5. C14/PseudoConstructor.cpp
El propósito de esta "pseudo-llamadas a los constructores" es una simple asignación. Es una técnica recomendada y un buen estilo de programación, que usted verá usar a menudo.
ncluso es posible utilizar esta sintaxis cuando se crean variables de tipos predefinidos fuera de la clase:
int i(100); int* ip = new int(47);
De esta forma, los tipos predefinidos actúan, más o menos, como los objetos. Sin embargo, recuerde que no son constructores reales. En particular, si usted no realiza una llamada explícita al constructor, no se ejecutará ninguna inicialización.