小编典典

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

all

我偏爱在构造函数中使用成员初始化列表……但我早就忘记了这背后的原因……

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


阅读 74

收藏
2022-05-22

共1个答案

小编典典

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

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

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

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

B()
  : a(3)
{
}

这只会调用A‘s
A(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;
};
2022-05-22