Korzyści z list inicjalizacyjnych
Z tego, co wiem o zaletach korzystania z listy inicjalizacyjnej, jest to, że zapewniają one wydajność podczas inicjowania elementów klasy, które nie są wbudowane. Na przykład,
Fred::Fred() : x_(whatever) { }
lepiej jest,
Fred::Fred() { x_ = whatever; }
jeśli x jest obiektem klasy niestandardowej. Poza tym ten styl jest używany nawet w przypadku typów wbudowanych ze względu na spójność.
Najczęstszą korzyścią jest zwiększenie wydajności. Jeśli wyrażenie jest tym samym typem, co zmienna składowa x_, wynik tego wyrażenia jest konstruowany bezpośrednio w x_ - kompilator nie tworzy osobnej kopii obiektu.
W innym stylu wyrażenie cokolwiek powoduje utworzenie oddzielnego, tymczasowego obiektu, a ten tymczasowy obiekt jest przekazywany do operatora przypisania obiektu x_. Następnie ten tymczasowy obiekt jest niszczony na; To nieefektywne.
Pytanie
Czy w poniższym przykładzie istnieje jakikolwiek przyrost wydajności przy użyciu listy inicjalizacji. Myślę, że nie ma zysku. Pierwsza wersja wywołuje konstruktor kopiowania ciągów, a drugi wywołuje operator przypisania ciągu znaków (nie ma żadnych tymczasowych kreacji). To prawda?
class MyClass
{
public:
MyClass(string n):name(n) { }
private:
string name;
};
class MyClass
{
public:
MyClass(string n)
{
name=n;
}
private:
string name;
};