Преимущества списков инициализации
Что я знаю о преимуществах использования списка инициализации, так это то, что они обеспечивают эффективность при инициализации членов класса, которые не являются встроенными. Например,
Fred::Fred() : x_(whatever) { }
предпочтительнее,
Fred::Fred() { x_ = whatever; }
если х является объектом пользовательского класса. Помимо этого, этот стиль используется даже со встроенными типами для согласованности.
Наиболее распространенным преимуществом этого является повышение производительности. Если выражение любого типа того же типа, что и переменная-член 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;
};