Некоторые преимущества и недостатки разных способов инициализации конструктора в C++:
Использование списков инициализации: 24
Преимущества:
- Повышение производительности. 4 Списки инициализации позволяют компилятору сгенерировать код для забивания памяти нулями ещё до вызова конструктора, что делает код более производительным. 5
- Инициализация постоянных элементов данных и ссылок. 2 Списки инициализации необходимы для этих целей, так как им нельзя присвоить значения после создания объекта. 2
Недостатки:
- Возможны ошибки. 1 Если при использовании списков инициализации вместо нужного типа указать другой, компилятор может выдать ошибку. 1
Присваивание в теле конструктора: 4
Преимущества:
- Возможность выбора порядка инициализации. 5 В теле конструктора можно самостоятельно выбирать порядок инициализации членов. 5
Недостатки:
- Создание временного объекта. 4 При использовании присваивания в конструкторе создаётся отдельный временный объект, который затем передаётся в оператор присваивания объекта-члена и уничтожается. 4
- Возможная потеря работы. 4 Объект-член полностью конструируется конструктором по умолчанию, который, например, выделяет определённый объём памяти или открывает файл. 4 Эта работа может быть напрасной, если оператор присваивания заставляет объект закрыть файл и/или освободить память. 4
Также существует назначенная инициализация, которая появилась в стандарте С++20. 3 Преимущество такого подхода в том, что не может быть неинициализированных переменных. 3 Однако назначенная инициализация работает только с агрегатными типами. 3