Benefícios das listas de inicialização
O que eu sei sobre os benefícios de usar a lista de inicialização é que eles fornecem eficiência ao inicializar membros da classe que não são internos. Por exemplo,
Fred::Fred() : x_(whatever) { }
é preferível a,
Fred::Fred() { x_ = whatever; }
se x é um objeto de uma classe personalizada. Fora isso, este estilo é usado mesmo com tipos incorporados por uma questão de consistência.
O benefício mais comum de fazer isso é melhorar o desempenho. Se a expressão for do mesmo tipo que a variável de membro x_, o resultado de qualquer expressão é construído diretamente dentro de x_ - o compilador não faz uma cópia separada do objeto.
Com o outro estilo, a expressão faz com que um objeto temporário separado seja criado e esse objeto temporário é passado para o operador de atribuição do objeto x_. Então esse objeto temporário é destruído no. Isso é ineficiente.
Questão
Existe algum ganho de eficiência no exemplo a seguir com o uso da lista de inicialização. Eu acho que não há ganho. A primeira versão chama o construtor de cópia da string eo operador de atribuição da outra string de chamada (não existe nenhum temporário criado). Isso correto?
class MyClass
{
public:
MyClass(string n):name(n) { }
private:
string name;
};
class MyClass
{
public:
MyClass(string n)
{
name=n;
}
private:
string name;
};