初始化列表的好处

初始化列表的好处

我所知道的使用初始化列表的好处是它们在初始化非内置的类成员时提供了效率。例如,

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;};


慕码人2483693
浏览 659回答 3
3回答

绝地无双

第二个版本是调用字符串的默认ctor,然后调用字符串的复制赋值运算符 - 与第一个版本相比,肯定存在(次要的)效率损失,直接调用c的copy-ctor(例如,根据字符串的实现,可能存在无用的分配 - 然后释放一些微小的结构)。为什么不总是以正确的方式使用? - )

眼眸繁星

我认为初始化const数据成员的唯一方法是在初始化列表中例如。在标题中:class C{     C();private:     const int x;     int y;}并在cpp文件中:C::C() :     x( 10 ),     y( 10 ){     x = 20; // fails     y = 20;}

扬帆大鱼

以下是使用初始化程序列表时的方案:用于初始化非静态const数据成员。用于初始化参考成员。用于初始化没有默认构造函数的成员对象。用于初始化基类成员。当构造函数的参数名称与数据成员相同时。出于性能原因。
打开App,查看更多内容
随时随地看视频慕课网APP