Mediumконструктор
Как работает конструктор с initializer list?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
В конструкторе члены инициализируются через initializer list ДО тела конструктора. Это единственный способ инициализировать const-члены, reference-члены, члены без default-конструктора и базовые классы.
class Foo {
const int id_; // const — только через init list
std::string& ref_; // reference — только через init list
std::string name_;
public:
// Инициализация ДО тела
Foo(int id, std::string& ref, std::string name)
: id_(id), ref_(ref), name_(std::move(name)) {}
};- Инициализация идёт в порядке объявления членов в классе, НЕ в порядке в init list (компилятор предупредит о reorder);
- Присваивание в теле
name_ = x;— это assignment (менее эффективно: сначала default-init, потом assign); - К моменту входа в тело все члены уже инициализированы.
Для не-POD типов предпочитайте initializer list.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.