Из того, что я знаю о преимуществах использования списка инициализации, заключается в том, что они обеспечивают эффективность при инициализации членов класса, которые не являются встроенными. Например,
Fred::Fred() : x_(whatever) { }
предпочтительнее,
Fred::Fred() { x_ = whatever; }
если x - объект пользовательского класса. Помимо этого, этот стиль используется даже со встроенными типами для согласованности.
Наиболее распространенным преимуществом этого является улучшение производительности. Если выражение любого типа того же типа, что и переменная-член x_, результат любого выражения строится непосредственно внутри x_ - компилятор не создает отдельную копию объекта.
В другом стиле выражение, которое вызывает отдельный, временный объект, который будет создан, и этот временный объект передается в оператор назначения объекта x_. Затем этот временный объект разрушается в;; Это неэффективно.
Вопрос
Есть ли коэффициент усиления эффективности в следующем примере с использованием списка инициализации.
Я думаю, что нет никакой выгоды. Первая версия вызывает конструктор строковых копий, а другой - оператор присваивания строк (нет временных созданий). Это правильно?
class MyClass
{
public:
MyClass(string n):name(n) { }
private:
string name;
};
class MyClass
{
public:
MyClass(string n)
{
name=n;
}
private:
string name;
};