#c# #c #initialization #initialization-order
Вопрос:
Я знаю, что в C объявление членов в заголовке класса определяет порядок инициализации. Можете ли вы сказать мне, почему C выбрал этот дизайн? Есть ли какие-либо преимущества в том, чтобы принудительно инициализировать порядок, а не следовать списку инициализаторов?
Ответ №1:
Конструкторы могут быть перегружены, а деструктор-нет. Если элементы данных могут быть инициализированы в разном порядке для разных конструкторов, то деструктор не может гарантировать выполнение уничтожения элементов данных в обратном порядке их построения (для объектов, построенных разными конструкторами).
Комментарии:
1. …и если вам необходим такой контроль, есть способы удалить инициализацию и уничтожение элемента из этих механизмов и сделать все это самостоятельно, но это (как правило) накладные расходы во время выполнения и концептуальные накладные расходы.
2. @HTNW Согласился с концептуальными накладными расходами, но почему во время выполнения? Если у вас есть буфер хранения элементов, а затем вы используете новое размещение в конструкторе, какие накладные расходы это будет иметь по отношению к традиционной переменной-члену?
3. @DanielLangr Я сказал «в целом», не всегда, хотя, если вы в конечном итоге сделаете это, я нахожу вероятным, что вам потребуется сохранить некоторые дополнительные данные для бухгалтерского учета. Например, если вы хотели воспроизвести уничтожение по умолчанию в обратном порядке построения, но порядок построения каким-то образом изменился, тогда вы должны сохранить порядок, в котором вы это сделали при строительстве, а затем перейти к этому при уничтожении. Или, если у вас иногда может не быть созданного элемента, вы должны помнить об этом при уничтожении (например
std::optional
,/std::variant
).