初始化列表的好处初始化列表的好处(Benefits of Initialization lists)

2019-05-08 15:00发布

我所知道的使用初始化列表的好处是什么,他们初始化类成员未建立,在时提供工作效率。 例如,

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

Answer 1:

第二个版本是调用字符串的默认构造函数,然后串的拷贝赋值运算符 - 有可以肯定是比第一位的,这直接调用C的拷贝构造函数(例如,取决于字符串的实现,有可能是(未成年人)的效率损失无用分配,然后释放一些微小的结构)。 为什么不总是用正确的方式 - ?)



Answer 2:

我想初始化const的数据成员的唯一方法是在初始化列表

例如。 在标题:

class C
{
    C();
private:
    const int x;
    int y;
}

而在cpp文件:

C::C() :
    x( 10 ),
    y( 10 )
{
    x = 20; // fails
    y = 20;
}


Answer 3:

这是初始化成员的好方法:

  • 是常量
  • 没有一个默认的构造函数(它是私有的)


Answer 4:

记得有一个拷贝构造函数和赋值运算符之间有明显的不同:

  • 拷贝构造函数的构造方法使用一些其他的实例作为一个地方从获取初始化信息的新对象。
  • 赋值运算符修改已经被完全构造(即使是只使用默认的构造函数)一个已经存在的对象

因此,在你的第二个例子,一些工作已经完成创建name由时间

 name=n;

到达了。

但是,它很可能(尤其是在这个简单的例子),其所做的工作是微乎其微(可能只是归零的一些数据成员string对象),而且工作是在一个优化的建立完全优化掉。 但它仍然被认为是很好的形式尽可能使用初始化列表。



Answer 5:

下面是当使用初始化列表的情况:

  1. 对于非静态常量数据成员的初始化。
  2. 对于参考成员初始化。
  3. 对于不具有默认的构造函数的成员对象的初始化。
  4. 为基类成员的初始化。
  5. 当构造函数的参数名称是一样的数据成员。
  6. 出于性能的考虑。


Answer 6:

我们还可以进行构造代表团通过初始化列表。



文章来源: Benefits of Initialization lists