14.3. Lista de inicializadores de un constructor

Hemos visto lo importante que es en C++ garantizar una correcta inicialización, y esto no va a cambiar en la composición ni en la herencia. Cuando se crea un objeto, el compilador garantiza la ejecución todos los constructores para cada uno de los subobjetos. Hasta ahora, en los ejemplos, todos los subobjetos tienen un constructor por defecto, que es ejecutado por el compilador automáticamente. Pero que ocurre si uno de nuestros subobjetos no tiene constructores por defecto, o si queremos cambiar los parámetros por defecto de un constructor. Esto supone un problema, porque el constructor de la nueva clase no tiene permiso para acceder a los miembros privados del subobjeto y por ello, no puede inicializarlos directamente.

La solución es simple: ejecutar el constructor del subobjeto. C++ proporciona una sintaxis especial para ello, la lista de inicializadores de un constructor. La forma de la lista de inicializadores de un constructor demuestra como actúa como la herencia. Con la herencia, las clases bases son colocadas después de dos puntos y justo después, puede abrir la llave para empezar con el cuerpo de la clase. En la lista de inicializadores de un constructor, se coloca las llamadas a los constructores de los subobjetos, después los argumentos del constructor y los dos puntos, pero todo esto, antes de abrir el brazo del cuerpo de la función. En una clase MyType, que hereda de Bar, sería de la siguiente manera:

MyType::MyType(int i) : Bar(i) { // ...

si el constructor de Bar tuviera un solo parámetro del tipo int.

14.3.1. Inicialización de objetos miembros

La inicialización de objetos miembros de una clase utiliza la misma sintaxis cuando se usa la composición. Para la composición, se proporcionan los nombres de los objetos en lugar de los nombres de las clases. Si se tiene más de una llamada al constructor en la lista de inicializadores, las llamadas se separan con comas:

MyType2::MyType2(int i) : Bar(i), m(i+1) { // ...

Esta sería la forma de un constructor de la clase MyType2, la cual hereda de Bar y contiene un miembro objeto llamado m. Fíjese que mientras podemos ver el tipo de la clase base en la lista de inicializadores del constructor, sólo podemos ver el miembro identificador objeto.