Es un patrón de diseño que tiene que ver con excepciones arrojado desde el interior de un constructor de objetos.
En C++ si se lanza una excepción desde el interior de un objeto costructor, dicho objeto se considera no construido en absoluto por el tiempo de ejecución del idioma. Como consecuencia, no se llamará al destructor de objetos cuando el objeto se salga del alcance.
Esto significa que si usted tenía un código como éste dentro de su constructor:
int *p1 = new int;
int *p2 = new int;
y el código como este en su destructor:
delete p1;
delete p2;
y la inicialización de p2 dentro del constructor falla debido a que no hay más memoria disponible, se lanza una excepción bad_alloc por el nuevo operador. En ese punto, su objeto no está completamente construido, incluso si la memoria para p1 ha sido asignada correctamente. Si esto sucede, no se invocará el destructor y tendrá una fuga de p1.
Por lo tanto, cuanto más código coloque dentro del constructor, mayor será la probabilidad de que se produzca un error que pueda ocasionar pérdidas de memoria.
Esa es la razón principal para esa elección de diseño, que no es una locura después de todo.
Más sobre esto en el blog de Herb Sutter: Constructors exceptions in C++
¿Por qué está etiquetado con Java y C++? ¿Deliberar? –
no, pero a veces se invoca init para inicializar después de dos constructores diferentes, para evitar el pegado del código. – Anycorn
virtual init() se puede utilizar para la inicialización polimórfica – vid