Рассмотрим эту программу:
#include <iostream>
struct A {
A() { std::cout << "A::A()\n"; }
A(int) { std::cout << "A::(int)\n"; }
void operator=(const A&) { std::cout << "A::operator=(const A&)\n"; }
};
struct C1 {
A a;
C1(int i) {
a = i;
}
};
struct C2 {
A a;
C2(int i) : a(i) {}
};
int main() {
std::cout << "How expesive is it to create a C1?\n";
{ C1 c1(7); }
std::cout << "How expensive is it to create a C2?\n";
{ C2 c2(7); }
}
В моей системе (Ubuntu 11.10, g ++ 4.6.1) программа выдает следующие данные:
How expesive is it to create a C1?
A::A()
A::(int)
A::operator=(const A&)
How expensive is it to create a C2?
A::(int)
Теперь рассмотрим, почему он это делает. В первом случае C1::C1(int)
, a
должны быть созданы по умолчанию, прежде чем конструктор C1
может быть вызван. Затем он должен быть назначен через operator=
. В моем тривиальном примере нет доступного оператора присваивания int
, поэтому мы должны создать A
из целого числа. Таким образом, цена отказа от использования инициализатора: один конструктор по умолчанию, один конструктор int
и один оператор присваивания.
Во втором случае, C2::C2(int)
, вызывается только конструктор int
. Какими бы ни были затраты на конструктор A
по умолчанию, очевидно, что стоимость C2:C2(int)
не превышает стоимость C1::C1(int)
.
<ч />
Или рассмотрите эту альтернативу. Предположим, что мы добавили следующий элемент в A
:
void operator=(int) { std::cout << "A::operator=(int)\n"; }
Тогда результат будет выглядеть так:
How expesive is it to create a C1?
A::A()
A::operator=(int)
How expensive is it to create a C2?
A::(int)
Сейчас вообще невозможно сказать, какая форма более эффективна. Является ли в вашем конкретном классе стоимость конструктора по умолчанию плюс стоимость назначения дороже, чем конструктор не по умолчанию? Если так, то список инициализации более эффективен. В противном случае это не так.
Большинство классов, которые я когда-либо писал, были бы более эффективно инициализированы в списке инициализации. Но это эмпирическое правило, и оно может быть неверным для каждого возможного случая.