[英]Use of parenthesis or curly braces in C++ constructor initializer list
[英]C++ With Initializer List a thing, when to use normal constructor?
我最近才刚开始回到C ++,并了解了初始化列表。 这似乎是初始化成员的标准方法。 话虽如此,我对此有两个问题:
在设置私有成员变量时(并且仅在构造函数中使用老式的设置)时,是否有理由不使用此方法。
我们从中得到什么确切的好处? 有人告诉我“速度”,但为什么不呢?
编辑:作为参考,我更具体地讲使用它们进行类初始化。
初始化列表与调用成员变量的ctor有关。 如果分配,则通过使用assign函数更改实例的值。 显然,这两个是不同的功能。
在某些情况下,您无法将值分配给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.