为什么我更喜欢使用成员初始化列表?

我偏爱使用构造函数使用成员初始化列表...但是我早已忘记了背后的原因......

你在构造函数中使用成员初始化列表吗? 如果是这样,为什么? 如果不是,为什么不呢?


对于POD类的成员来说,这没什么区别,只是风格问题。 对于类成员来说,它避免了对默认构造函数的不必要的调用。 考虑:

class A
{
public:
    A() { x = 0; }
    A(int x_) { x = x_; }
    int x;
};

class B
{
public:
    B()
    {
        a.x = 3;
    }
private:
    A a;
};

在这种情况下, B的构造函数将调用A的默认构造函数,然后将ax初始化为3.更好的方法是让B的构造函数在初始化程序列表中直接调用A的构造函数:

B()
  : a(3)
{
}

这只会调用AA(int)构造函数,而不是它的默认构造函数。 在这个例子中,差异是可以忽略的,但想象一下,如果你将A的默认构造函数做得更多,例如分配内存或打开文件。 你不会想这样做不必要的。

此外,如果一个类没有默认的构造函数,或者你有一个const成员变量,那么你必须使用一个初始化程序列表:

class A
{
public:
    A(int x_) { x = x_; }
    int x;
}

class B
{
public:
    B() : a(3), y(2)  // 'a' and 'y' MUST be initialized in an initializer list;
    {                 // it is an error not to do so
    }
private:
    A a;
    const int y;
};

除了上面提到的性能原因外,如果你的类存储对作为构造函数参数传递的对象的引用,或者你的类有const变量,那么你除了使用初始值设定项列表外没有其他选择。


  • 基类的初始化
  • 使用构造函数初始化器列表的一个重要原因是这里没有提到的答案是基类的初始化。

    按照建造顺序,基础班应在孩子班之前建造。 没有构造函数初始化列表,如果你的基类有默认的构造函数,在进入子类的构造函数之前调用它,这是可能的。

    但是,如果你的基类只有参数化构造函数,那么你必须使用构造函数初始化列表来确保你的基类在子类之前被初始化。

  • 初始化只有参数化构造函数的子对象

  • 效率

  • 使用构造函数初始值设定项列表,可以将数据成员初始化为代码中所需的确切状态,而不是首先将它们初始化为默认状态,然后将其状态更改为代码中需要的状态。

  • 初始化非静态常量数据成员
  • 如果类中的非静态常量数据成员具有默认构造函数并且您不使用构造函数初始化函数列表,那么您将无法将它们初始化为预期状态,因为它们将被初始化为默认状态。

  • 初始化参考数据成员
  • 当编译器输入构造函数时,引用数据成员必须初始化,因为引用不能只是稍后声明和初始化。 这只有在构造函数初始化列表中才有可能。

    链接地址: http://www.djcxy.com/p/40305.html

    上一篇: Why should I prefer to use member initialization list?

    下一篇: struct vs. class