Даже если на этот вопрос уже есть принятый ответ, давайте немного уточним.
Давайте приведем пример, в котором один работает, а другой нет:
class Foo
{
public:
Foo(int value);
private:
Foo();
int content;
};
class Bar
{
public:
Bar(int value);
private:
Foo foo;
};
A рабочая реализация конструктора будет
Bar::Bar(int value) : foo(value) {}
Если, однако, вам будет go нравится
Bar::Bar(int value)
{
foo = Foo(value);
}
Что произойдет, если это не скомпилируется. В качестве демонстрации я создал http://cpp.sh/2vfwqk, посмотрим, что произойдет, если вы попытаетесь запустить его. Затем откомментируйте нижнюю реализацию и закомментируйте вышеприведенную.
Дело в том, что Foo()
необходимо будет вызвать, прежде чем он сможет начать обрабатывать тело, поскольку foo
необходимо инициализировать.
И список инициализатора делает это напрямую.
(Пример также сработает, если вместо того, чтобы сделать пустой конструктор закрытым, я полностью его опущу, но так легче понять).
Другое дело, что если бы Foo()
было бы опубликовано c, он бы создал два объекта. Если они легкие, нет проблем, но если пустой конструктор требует большого объема памяти или времени, что нежелательно.
И это в значительной степени необходимо для членов, которые являются ссылками.
Может быть, стоит прочитать для вас : https://www.geeksforgeeks.org/when-do-we-use-initializer-list-in-c/