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 подскажет развёрнутый ответ в реальном времени.