Рассмотрим следующий конструктор, инициализирующий объект члена x_
с помощью списка инициализации: Fred::Fred() : x_(whatever) { }
. Наиболее предпочтительным преимуществом этого является улучшение производительности. Для примера , если выражение типа того же типа, что и член , переменная x_
, результат любого выражения сконструирован непосредственно внутри x_
- компилятор не делает отдельную копию объекта . Даже если типы не совпадают, компилятор обычно способен выполнять лучшую работу с списками инициализации, чем с заданиями .
Другой (неэффективный) способ построения конструкторов - через назначение, такой как: Fred::Fred() { x_ = whatever; }
. В этом случае выражение независимо от того, что вызывает создание отдельного временного объекта, и этот временный объект передается в оператор присваивания объекта x_
. Затем этот временный объект разрушается на ;
. Это неэффективно.
Как будто это было не так плохо, есть еще один источник неэффективности при использовании задания в конструкторе: объект члена получит полностью построенный конструктор по умолчанию, и это может, например, выделить некоторое значение по умолчанию объем памяти или открыть файл по умолчанию . Вся эта работа может быть напрасной, если любое выражение и/или оператор присваивания заставляет объект закрыть этот файл и/или освободить эту память (например,, если конструктор по умолчанию не выделял достаточно большой пул памяти или если он открыл неправильный файл).
Вывод: при прочих равных условиях ваш код будет работать быстрее, если вы используете списки инициализации вместо назначения.
Вам не хватает примера, используя инициализаторы ctor. Второй пример - это просто присваивать значение 'a', поскольку оно уже инициализировано. Менее важно для интегральных типов, более важных для сложных. –
@KaiSchmidt: CaptionObvious ссылается на это: 'MyClass(): a (5) {}', и он имел в виду, что вы "* присваиваете значение' a' ** после того, как ** оно уже было инициализировано * ". –
Я вижу. Должен ли я использовать этот метод для инициализации более одного члена, как бы выглядел синтаксис? –