Списки инициализаторов предназначены только для этой цели.Они используются для вызова конструктора членов, а не для их назначения.Это может быть немного быстрее, если построение по умолчанию и последующее назначение выполняются медленнее, чем создание напрямую.Они должны использоваться вместо назначения почти во всех случаях.Использование их для инициализации примитивов не дает никакого преимущества в производительности (в данном случае это просто вопрос стиля, поэтому я обычно делаю это в любом случае).
Так вы бы написали свой конструктор, используя списки инициализаторов членов.
B::B(char _letter, int _num1, string _word)
: letter(_letter), a(_num1, _word) {}
Это можно немного улучшить.Мы можем дать параметрам те же имена, что и членам.В этом случае компилятор сделает «правильную вещь» и инициализирует член параметром.Это также позволяет избежать запуска идентификаторов с подчеркиванием , что является отдельной проблемой .
B::B(char letter, int num1, string word)
: letter(letter), a(num1, word) {}
Одна вещь, которую следует отметить в списках инициализаторов элементов, - это порядок инициализации.Члены будут инициализированы в том порядке, в котором они объявлены в классе.В этом случае letter
будет инициализирован до a
. Порядок списков инициализации не влияет на порядок инициализации. Рассмотрим этот пример:
B::B(char letter, int num1, string word)
: a(num1, word), letter(letter) {}
Это инициализирует letter
, а затем a
.Вот почему вы должны убедиться, что порядок совпадает с объявленным в классе.Если вы передадите соответствующие флаги предупреждения своему компилятору, он сообщит вам об этом, и ваша IDE может даже изменить порядок вещей для вас.