2016-01-13 3 views
2

Рассмотрим ниже классВажен ли параметр переменной, используемый в списке инициализации конструктора?

class A 
{ 
int a; 
double b; 
float c; 
A():a(1),c(2),b(3) 
{} 
} 

ли мы использовать переменные в списке инициализации в том же порядке, как мы объявили в классе? И будет ли порядок переменных в списке инициализации иметь какое-либо влияние на распределение памяти этого класса/переменных? (рассмотрим сценарий, если класс имеет много переменных bool, много двойных переменных и т. д.)

+0

дубликат [Порядок оценки инициализации списка конструктора] (https://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-order) –

ответ

5

Нужно ли использовать переменные в списке инициализации в том же порядке, что и в классе?

Заказ списка инициализации не влияет на порядок инициализации. Поэтому он избегает вводящего в заблуждение поведения для использования реального порядка в списке инициализации.

Проблема возникает, когда есть зависимости:

class A 
{ 
    int a; 
    double b; 
    float c; 
    // initialization is done in that order: a, b, c 
    A():a(1), c(2), b(c + 1) // UB, b is in fact initialized before c 
    {} 
}; 

Будет ли порядок переменных в списке инициализации имеет какое-либо влияние на распределение памяти этого класса/переменных?

Заказ списка инициализации не влияет на макет или в порядке инициализации.

2

Переменные будут инициализированы в порядке декларации в классе.

Порядок переменных в списке инициализации не влияет.

В нашем примере порядок initializtion переменных будет следующим: a, b, c

И Будут ли порядок переменных в списке инициализации имеет какое-либо влияние на выделении памяти этого класса/переменные?

Не действует.

4

Во-первых,

ли мы использовать переменные в списке инициализации в том же порядке, как мы объявили в классе?

Нет, но вам лучше сделать это, чтобы избежать путаницы. Потому что порядок member initializers в списке не имеет значения.

Порядок инициализаторы членов в списке не имеет значения: фактическая порядок инициализации выглядит следующим образом:

1) Если конструктор для наиболее производных классов, классы виртуальных базовых инициализируются в порядке, в котором они появляются в глубине первой слева направо обход декларация базового класса (слева-направо относится к появлению в списках базовых спецификаторов)

2) Затем, прямой базовые классы инициализируются в порядок слева направо, как они появляются в списке базового спецификатора этого класса

3) Затем нестатические элементы данных инициализируются в порядке объявлений в определении класса.

4) Наконец, тело конструкторе выполняется

Во-вторых,

И будет порядок переменных в списке инициализации имеет какое-либо влияние на распределение памяти этого класса/переменных ?

Нет, потому что это вообще не имеет значения.

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

  • Нет связанных вопросов^_^