Mediuminit-list

Почему нужно использовать initialization lists в конструкторах?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Member init list инициализирует члены напрямую, а не через default-init + assignment. Эффективнее и обязательно для const/ссылок.

class Widget {
    const int id_;          // const — только через init list
    Logger& logger_;        // ссылка — только через init list
    std::string name_;
public:
    // ХОРОШО: init list — прямая инициализация
    Widget(int id, Logger& log, std::string name)
        : id_(id), logger_(log), name_(std::move(name)) {}

    // ПЛОХО: default-init + assignment (двойная работа для string)
    // Widget(int id, Logger& log) { id_ = id; /* const нельзя! */ }
};

// C++11 in-class initializer — default, ctor может override
class Config {
    int timeout_ = 30;
    std::string host_ = "localhost";
};

Важно: порядок инициализации — порядок объявления в классе, не порядок в init list.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.