Инициализация класса C++, содержащая инициализацию переменной класса

вы имеете в виду что-то вроде этого?

List<String> blah = new ArrayList<String>(){{add("asdfa");add("bbb");}};

это инициализация списка массивов во время создания (hack)

13
задан Dinah 6 May 2010 в 14:36
поделиться

8 ответов

  • Это более эффективно (в целом). Все члены класса инициализируются в конструкторе, инициализируете ли Вы явно их или нет. Если Вы не указываете инициализатор, то конструктор по умолчанию участника запущен. Если Вы присваиваете значение в теле конструктора, то оператор присваивания называют снова. Это не относится к скалярным величинам, как в Вашем примере, так как скалярные величины не имеют конструкторов.
  • Вы не можете случайно присвоить значение дважды в списке инициализатора.
  • компилятор может проверить, чтобы удостовериться, что порядок, в котором Вы пишете инициализаторы, соответствует порядку, в котором участники определяются в классе. Стандарт C++ требует, чтобы участники были инициализированы в порядке, которым они объявляются, независимо от порядка, который Вы пишете инициализаторам. Наличие компилятора проверяет, что этот порядок гарантирует, что программист знает, в каком порядке инициализаторы будут выполнены (снова, это более важно для участников не-POD, чем для скаляров).
  • Ссылочные типы и const участники должны быть инициализированы в списке инициализатора, потому что Вы не можете присвоить ссылке или const участник.
26
ответ дан 1 December 2019 в 19:15
поделиться

Лучше сделать инициализацию участников в списке инициализации, потому что участники затем только инициализируются однажды. Это может быть огромной разницей в производительности (и даже поведение), если участники являются самими классами. Если участники являются всей неконстантой, нессылочными основополагающими типами данных, то различие обычно незначительно.

ПРИМЕЧАНИЕ : существуют времена, где списки инициализации требуются для основополагающих типов данных - конкретно, если тип является постоянным или ссылка. Для этих типов данные могут только быть инициализированы однажды, и таким образом они не могут быть инициализированы в теле конструктора. См. эта статья для получения дополнительной информации.

Примечание, что порядок инициализации участников является порядком участники, объявляется в определении класса, не порядке, которым участники объявляются в списке инициализации. Если предупреждение может быть зафиксировано путем изменения порядка списка инициализации, то я настоятельно рекомендую, чтобы Вы сделали так.

Это - моя рекомендация что:

  • Вы учитесь любить списки инициализации.
  • Ваш коллега понимает правила для порядка инициализации участников (и избегайте предупреждений).
4
ответ дан 1 December 2019 в 19:15
поделиться

В дополнение к Greg Hewgill превосходный ответ - переменные константы должны быть установлены в списке инициализации.

3
ответ дан 1 December 2019 в 19:15
поделиться

Поскольку, в теле конструктора ("в фигурных скобках") членские переменные уже создаются из значения по умолчанию. Это может иметь некоторые последствия производительности, когда у Вас есть членская переменная типа, который имеет нетривиальную конструкцию, когда Вам сначала создали из значения по умолчанию она, и затем Вы присваиваете ей некоторое другое значение в конструкторе, когда у Вас могла быть пользовательская конструкция она непосредственно.

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

2
ответ дан 1 December 2019 в 19:15
поделиться

Если у Вас есть переменные константы, их значение не может быть установлено через присвоение.

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

См. C++, Облегченный FAQ для получения дополнительной информации

2
ответ дан 1 December 2019 в 19:15
поделиться

Смотрите на собранную мудрость в http://web.tiscali.it/fanelia/cpp-faq-en/ctors.html#faq-10.6

0
ответ дан 1 December 2019 в 19:15
поделиться

Другое дополнение к ответу Greg: участники, которые имеют типы без конструктора по умолчанию, должны быть инициализированы в списке инициализации.

0
ответ дан 1 December 2019 в 19:15
поделиться

Ответ Грега Хегвелла содержит несколько отличных советов, но он не объясняет, почему компилятор выдает предупреждение.

Когда список инициализаторов конструктора обрабатывается компилятором, элементы инициализируются в порядке их объявления в объявлении класса, а не в порядке их появления в списке инициализаторов.

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

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

0
ответ дан 1 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: