#c #constructor
#c #конструктор
Вопрос:
Я пытаюсь лучше понять, как конструкторы работают в C . В принципе, я хотел бы знать, все ли установлено по порядку при инициализации класса с помощью списка инициализаторов членов в конструкторе.
Constructor(int number1, int number2) :
m_number1(number1),
m_number2(m_number1 > 0 ? 0 : number2)
{
}
Я ожидаю, что это будет допустимый механизм, однако, возможно, в некоторых особых случаях он не работает.
Комментарии:
1.Члены будут инициализированы в порядке, в котором они отображаются в определении класса. Поэтому, если вы разместите их в другом порядке в списке инициализатора, вы можете легко допустить ошибку здесь. Итак, все в порядке, пока
m_number1
появляется передm_number2
в классе.2. Если вам нужно полагаться на что-то подобное, возможно, вы захотите пересмотреть свой код. Я имею в виду, как указывали другие, в этом случае существует определенное гарантированное поведение, но его последующее изменение может очень легко привести к ошибке. Если порядок важен и для инициализации элемента вам действительно нужно использовать другой элемент, а не параметр, вы можете рассмотреть возможность не делать этого в списке инициализаторов, даже если вы знаете, что это сработает прямо сейчас.
Ответ №1:
Порядок инициализации нестатических членов определяется порядком их появления в определении класса. Это не связано с порядком, в котором эти члены перечислены в списке инициализатора конструктора.
Ваш пример;
Constructor(int number1, int number2) :
m_number1(number1),
m_number2(m_number1 > 0 ? 0 : number2)
{
}
не будет работать так, как вы ожидаете, если m_number2
появится раньше m_number1
в определении класса.
Полагаться на определенный порядок может быть рискованно, если определение класса обновляется, поскольку обновления могут изменить порядок, в котором нестатические члены отображаются в объявлении класса (например, если какой-то член команды решит, что члены более логично сгруппированы по-разному).
Комментарии:
1. Стоит отметить, что компиляторы обычно также имеют предупреждения о несоответствующих порядках.