Могу ли я использовать ранее заданную переменную для создания следующего члена класса?

#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. Стоит отметить, что компиляторы обычно также имеют предупреждения о несоответствующих порядках.