Предположим, я хочу иметь конструктор, который получает некоторые параметры, и с этими параметрами я могу вычислить значения для его переменных-членов. За исключением того, что значения переменных-членов не являются простыми присвоениями параметров. Они требуют создания других объектов и преобразования значений, прежде чем их можно будет использовать в качестве значений для переменных-членов.
Это слишком много, чтобы втиснуть его в список инициализаторов. Также очень неэффективно, поскольку вы не можете создавать переменные и использовать их повторно, поэтому вам придется копировать код (и делать несколько копий одного и того же объекта), чтобы он соответствовал всему коду в списке инициализаторов.
Другой вариант — не использовать список инициализаторов и позволить вызвать конструктор по умолчанию, а затем перезаписать значения внутри конструктора аккуратными вычислениями.
А что если у класса нет конструктора по умолчанию? Как можно сделать это аккуратно?
/* a class without a default constructor */
class A {
public:
B x1
B x2
A(B x1_, B x2_) : x1{x1_}, x2{x2_} {};
};
/* a class that contains an A object and needs to initialize it based on some complex logic */
class C {
public:
A a;
C(D d) :
a{b1,b2} // ultimately I just want to initialize a with two B objects
// but unfortunatelly they require a lot of work to initialize
// including instantiating other objects and using tons of methods
{}
};