Рассмотрим следующее:
struct C {
C() { /* construct the object */ }
};
struct X {
C member;
X() { member = C(); }
};
Конструктор X()
такой же, как если бы вы сказали:
X() : member() { member = C(); }
Во-первых, конструктор C
вызывается для конструированияmember
элемент данных.Затем выполняется тело X
, создается второй временный объект C
, которому назначается member
, а затем временный объект уничтожается.
Обратите внимание, что это относится только ктипы, которые инициализируются автоматически.Если бы member
был типа int
или типа класса POD (как примеры), он был бы неинициализирован при вводе тела конструктора X
.
Для таких типов это не такс точки зрения производительности действительно важно, инициализируете ли вы элемент данных в списке инициализации или назначите элемент данных в теле конструктора;разница полностью стилистическая.Там, где это возможно, список согласованности все же следует отдавать предпочтение ради согласованности.