Я понимаю, что это очень старая тема, но я хотел добавить что-то, что не было явно указано (или, возможно, просто подразумевается). В C ++, когда конструктор выдает исключение, объект не считается «созданным», и поэтому его деструктор не будет вызываться как часть разматывания исключения.
Это может быть очень реальным мотивирующим фактором для использования метода initialise () вместо того, чтобы делать это в конструкторе. Сложный объект, занимающий много места в памяти и т. П., Должен был бы отмотать всю эту работу вручную, если конструктор выдал исключение.
Если используется метод initialise (), объект уже «создан» во время инициализации, и, следовательно, будет вызван деструктор объекта.
Итак, да, выполнение инициализации в конструкторе "приятнее", но это также возлагает на программиста большую нагрузку на правильную очистку, если что-то пойдет не так. Частичный подход к очистке приведет к очень уродливому коду.
Поэтому в некоторых случаях было бы лучше принять прагматизм, а не идеализм.