2009-08-07 3 views
202

У меня есть конструктор, который принимает некоторые аргументы. Я предположил, что они были построены в указанном порядке, но в одном случае кажется, что они были построены в обратном порядке, что привело к прерыванию. Когда я отменил аргументы, программа прекратила прерывание. Это пример синтаксиса, который я использую. Дело в том, что a_ должно быть инициализировано до b_ в этом случае. Можете ли вы гарантировать порядок строительства?Порядок оценки инициализации списка конструктора

например.

class A 
{ 
    public: 
    A(OtherClass o, string x, int y) : 
     a_(o), b_(a_, x, y) { } 

    OtherClass a_; 
    AnotherClass b_; 
}; 
+3

Вы говорите, что задаете аргументы конструктора, но они оцениваются до того, как вы когда-либо достигнете конструктора, и они оцениваются в неуказанном, определенном компилятором порядке. Но вы действительно спрашиваете о порядке списков инициализации, поэтому я изменил заголовок вопроса для вас. –

ответ

220

Это зависит от порядка объявления переменных-членов в классе. Итак, a_ будет первым, тогда b_ будет вторым в вашем примере.

+15

На самом деле, хорошие компиляторы будут предупреждать, если в объявлении есть другой порядок в сравнении с списком инициализации конструктора. Например, см. '-Wreorder' в gcc. –

+207

Причина, по которой они построены в порядке объявления элемента, а не в порядке в конструкторе, состоит в том, что у каждого может быть несколько конструкторов, но есть только один деструктор. И деструктор уничтожает членов в обратном порядке строительства. – AProgrammer

170

Процитируем стандарт для осветления:

12.6.2.5

Инициализация должна происходить в следующем порядке:

...

  • Тогда, нестатические члены данных должны быть инициализированы в том порядке, в котором они были объявлены в классе definiti на (опять же, независимо от порядка mem-инициализаторов).

...

4

standard reference для этого теперь, кажется, 12.6.2 раздел 13.3:

(13,3) - Тогда, не статические данные инициализируются в том порядке, в котором они были объявлены в определении класса (опять же независимо от порядка ввода-инициализаторов).

Смежные вопросы