Non-Rules and myths
NR.5
Не используйте двухфазную инициализацию
Причина
Разделение инициализации на два этапа ведёт к более слабым инвариантам, более сложному коду (необходимость обрабатывать частично инициализированные объекты) и большему числу ошибок.
Пример (плохой)
// Old conventional style: многие ресурсы оказываются в полуинициализированном состоянии
class Picture
{
int mx;
int my;
int * data;
public:
// init() вызывается сразу после constructor
Picture(int x, int y)
{
mx = x; // ПЛОХО: выполнение работы в теле конструктора
my = y;
data = nullptr; // ПЛОХО: отсрочка ресурса
}
~Picture()
{
Cleanup();
}
// ...
void init() { // ПЛОХО: двухфазная инициализация
// ... более сложная работа ...
data = (int*) malloc(mx*my*sizeof(int)); // ПЛОХО: голый new/malloc
}
void Cleanup() {
if (data) free(data);
data = nullptr;
}
};
Picture p;
p.init(); // p частично инициализирована — плохо
Альтернатива
- Помещайте всю инициализацию в конструктор.