Всегда полностью инициализируйте перед использованием, не требуя от пользователя класса делать что-либо, кроме создания и использования объекта.
Задерживать полную инициализацию до первого вызова обычной функции-члена можно только в том случае, если это требует профилирования производительности.
Используйте только двухэтапную инициализацию (т. Е. Пользователь ДОЛЖЕН построить, а затем ДОЛЖЕН вызвать пользовательскую функцию Init (), прежде чем использовать объект для реального), где это ЕДИНСТВЕННЫЙ способ достижения инициализации.
Если вы разрешаете пользователям вашего кода создавать неполные объекты и вам требуется определенная последовательность вызовов методов, чтобы сделать объект безопасным для использования, тогда вы просто создаете ошибки на будущее.