繁体   English   中英

C ++与Initializer List一件事,什么时候使用普通的构造函数?

[英]C++ With Initializer List a thing, when to use normal constructor?

我最近才刚开始回到C ++,并了解了初始化列表。 这似乎是初始化成员的标准方法。 话虽如此,我对此有两个问题:

  1. 在设置私有成员变量时(并且仅在构造函数中使用老式的设置)时,是否有理由不使用此方法。

  2. 我们从中得到什么确切的好处? 有人告诉我“速度”,但为什么不呢?

编辑:作为参考,我更具体地讲使用它们进行类初始化。

初始化列表与调用成员变量的ctor有关。 如果分配,则通过使用assign函数更改实例的值。 显然,这两个是不同的功能。

在某些情况下,您无法将值分配给ctor中的成员变量。

  • 当成员变量为const时。
  • 当成员变量是没有默认ctor的类的实例时。
  • 当成员变量是引用时(与上述原因相同)
  • 初始化基类

当创建不带init-list的实例时,成员变量将运行其ctor,然后如果您为其赋值,则进行赋值。 这是一个细微的差异,但是由于ctor首先运行,而Assign运行2nd,则可能会产生一定的损失-这是不必要的开销。

您应该知道,“在构造函数(主体)中设置(成员数据)”是分配给已经初始化的对象的。 那不能提供构造函数参数。 不能分配const成员和引用。

ctor-initializer-list(并且由于C ++ 11,在声明的成员点处指定了花括号或相等的初始化程序)可以进行真正的初始化,因此应该首选。

构造函数主体仍然可以有一些用途...产生副作用或循环...甚至可以通过从一个ctor-initializer-list表达式内部调用一个辅助函数来实现这些目的。

同样,成员初始化是其设置失败的唯一方法,而这种方式不会导致以后的销毁。 构造函数主体中的异常将中止父对象的创建...但是析构函数仍需要为所有子对象运行,因此将它们置于已知的可破坏状态的任何设置都必须已经完成。

构造函数初始化列表是一个非常有用的工具。 如果您不使用它,我会在代码审查中拒绝您的代码。

C ++有两种初始化成员的方法。 每当声明成员时,都可以为其指定默认值:

class C {
    int i = 42;
public:
    C(int j);
    C() = default;
};

这是在良好的默认值上初始化简单成员的非常有用的技术。

然后,您有了初始化列表:

C(int j) : i{j} {}

在此列表中,您可以覆盖初始化。 未提及的所有成员均从定义中获取初始化。 请注意,具有默认构造函数的类不需要显式初始化。

初始化列表可以使用构造函数的参数。 但是,通过在定义时初始化成员,可以更轻松地发现未初始化的成员。

那么什么时候不使用初始化列表进行初始化呢? 永远不要,因为构造函数主体中的分配是分配,而不是初始化。

您实际上不需要主体来分配成员,但是,如果您没有激活-Wreorder警告,那么分配一个依赖于另一个成员的成员可能很有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM