我知道使用初始化列表的好处是它们在初始化非内置类成员时提供了效率。例如,
Fred::Fred() : x_(whatever) { }
更可取的是,
Fred::Fred() { x_ = whatever; }
如果 x 是自定义类的对象。除此之外,为了保持一致性,这种风格甚至与内置类型一起使用。
这样做最常见的好处是提高了性能。如果表达式whatever 与成员变量x_ 的类型相同,则whatever 表达式的结果直接在x_ 内部构造——编译器不会制作对象的单独副本。
对于另一种风格,表达式whatever 会导致创建一个单独的临时对象,并且这个临时对象被传递给x_ 对象的赋值运算符。然后该临时对象在 ; 处被破坏。那是低效的。
问题
在以下示例中使用初始化列表是否有任何效率提升。我认为没有收获。第一个版本调用字符串的复制构造函数,另一个调用字符串的赋值运算符(没有创建任何临时的)。对吗?
class MyClass
{
public:
MyClass(string n):name(n) { }
private:
string name;
};
class MyClass
{
public:
MyClass(string n)
{
name=n;
}
private:
string name;
};