Почему C заставляет инициализацию переменных-членов находиться в порядке объявления

#c# #c #initialization #initialization-order

Вопрос:

Я знаю, что в C объявление членов в заголовке класса определяет порядок инициализации. Можете ли вы сказать мне, почему C выбрал этот дизайн? Есть ли какие-либо преимущества в том, чтобы принудительно инициализировать порядок, а не следовать списку инициализаторов?

Ответ №1:

Конструкторы могут быть перегружены, а деструктор-нет. Если элементы данных могут быть инициализированы в разном порядке для разных конструкторов, то деструктор не может гарантировать выполнение уничтожения элементов данных в обратном порядке их построения (для объектов, построенных разными конструкторами).

Комментарии:

1. …и если вам необходим такой контроль, есть способы удалить инициализацию и уничтожение элемента из этих механизмов и сделать все это самостоятельно, но это (как правило) накладные расходы во время выполнения и концептуальные накладные расходы.

2. @HTNW Согласился с концептуальными накладными расходами, но почему во время выполнения? Если у вас есть буфер хранения элементов, а затем вы используете новое размещение в конструкторе, какие накладные расходы это будет иметь по отношению к традиционной переменной-члену?

3. @DanielLangr Я сказал «в целом», не всегда, хотя, если вы в конечном итоге сделаете это, я нахожу вероятным, что вам потребуется сохранить некоторые дополнительные данные для бухгалтерского учета. Например, если вы хотели воспроизвести уничтожение по умолчанию в обратном порядке построения, но порядок построения каким-то образом изменился, тогда вы должны сохранить порядок, в котором вы это сделали при строительстве, а затем перейти к этому при уничтожении. Или, если у вас иногда может не быть созданного элемента, вы должны помнить об этом при уничтожении (например std::optional ,/ std::variant ).