为了账号安全,请及时绑定邮箱和手机立即绑定

初始化列表的好处

初始化列表的好处

C++
慕码人2483693 2019-08-02 16:57:31
初始化列表的好处我所知道的使用初始化列表的好处是它们在初始化非内置的类成员时提供了效率。例如,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;};
查看完整描述

3 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

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


查看完整回答
反对 回复 2019-08-02
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

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

例如。在标题中:

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

并在cpp文件中:

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


查看完整回答
反对 回复 2019-08-02
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

以下是使用初始化程序列表时的方案:

  1. 用于初始化非静态const数据成员。

  2. 用于初始化参考成员。

  3. 用于初始化没有默认构造函数的成员对象。

  4. 用于初始化基类成员。

  5. 当构造函数的参数名称与数据成员相同时。

  6. 出于性能原因。


查看完整回答
反对 回复 2019-08-02
  • 3 回答
  • 0 关注
  • 658 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信