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

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

最佳答案

对于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的默认构造函数,然后将a.x初始化为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;
};

关于c++ - 为什么我更喜欢使用成员初始化列表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48570564/

10-15 06:39