14.3.2. Tipos predefinidos en la lista de inicialización

La lista de inicialización del constructor permite invocar explícitamente a los constructores de los objetos miembro. De hecho, no existe otra forma de llamar a esos constructores. La idea es que todos los constructores se llamen antes de entrar en el cuerpo del constructor de la nueva clase. De esta forma, cualquier llamada que se haga a las funciones miembro de los subobjetos siempre irá dirigida a objetos inicializados. No hay manera de llegar a la llave de apertura del constructor sin que se haya llamado a algún constructor para cada uno de los objetos miembro y de los objetos de la clase base, aunque el compilador tenga que hacer una llamada oculta a un constructor por defecto. Esto refuerza aún más la garantía de C++ de que ningún objeto (ni parte de un objeto) puede salir de la línea de partida sin que se haya llamado a su constructor.

La idea de que todos los objetos miembro estén inicializados al llegar a la llave de apertura del constructor es también una buena ayuda para programar. Una vez alcanzada la llave de apertura, puede asumir que todos los subobjetos están correctamente inicializados y centrarse en las tareas concretas que desee realizar en el constructor. Sin embargo, hay un inconveniente: ¿qué ocurre con los objetos miembro de tipos predefinidos, que no tienen constructor?

Para que la sintaxis sea coherente, se permite tratar los tipos predefinidos como si tuviesen un único constructor que recibe un único argumento: una variable del mismo tipo que la variable que se está inicializando. Así, puede escribir

//: 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


Lo que hacen estas «pseudollamadas a constructor» es una simple asignación. Es una técnica práctica y un buen estilo de programación, así que la verá utilizar a menudo.

Incluso es posible utilizar la sintaxis de pseudoconstructor cuando se crean variables de tipos predefinidos fuera de una clase:

int i(100);
int* ip = new int(47);

De esta forma, los tipos predefinidos se comportan un poco más como objetos. Sin embargo, recuerde que no son constructores reales. En particular, si no realiza explícitamente una llamada al pseudoconstructor, no se realiza ninguna inicialización.