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;
};