Why should I prefer to use member initializer lists?

For POD data members, it makes no difference, it’s just a matter of style. For class members which are classes, then it avoids an unnecessary call to a default constructor. Consider:

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

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

In this case, the constructor for B will call the default constructor for A, and then initialize a.x to 3. A better way would be for B‘s constructor to directly call A‘s constructor in the initializer list:

B() : a(3) {}

This would only call A‘s A(int) constructor and not its default constructor. In this example, the difference is negligible, but imagine if you will that A‘s default constructor did more, such as allocating memory or opening files. You wouldn’t want to do that unnecessarily.

Furthermore, if a class doesn’t have a default constructor, or you have a const or reference data member, you must use an initializer list:

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

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

Leave a Comment