Какими методами лучше инициализировать параметры класса. (Лист инициализации, move семантика, вызов конструктора через конструктор)

задался вопросом относительно того, что и когда правильнее использовать. Был бы благодарен если бы объяснили как работает нижеперечисленные фрагменты кода, которые я нашёл в просторах интернета и не слишком понимаю как они работают.

Предположим класс Node имеет два параметра Type value и Node *nextp.

Тут при создании объекта класса Node, вызывается конструктор класса, а передача значения происходит с помощью move семантики? В чём преимущество такой инициализации и какие у него недостатки?

 template<typename Type>
inline Node<Type>::Node(Type v) : value(v), nextp(nullptr)
{
}

Тут при создании объекта класса Node, вызывается конструктор класса, а передача значения происходит с помощью списка/листа инициализации? Происходит ли инициализация параметров класса в динамической памяти (в heap) или же параметры остаются статичными? Как добиться в этом случае инициализации параметров в динамическую паять?

template<typename Type>
inline Node<Type>::Node(Type v) : value{v}, nextp{nullptr}
{
}

Таким же образом через конструктор Node наверное пытались вызывать некий другой конструктор, который вызывал бы инициализацию поля/параметра value. Является ли такой способ правильным?

template<typename Type>
inline Node<Type>::Node(Type v) : anc_constructor(v), nextp(nullptr)
{
}

Ответы (1 шт):

Автор решения: Vlad

Спасибо, комментатору выше. Окончательный ответ был бы невозможным без него. Так вот. Как оказалось существенной разницы между () и {} скобкам в списке инициализаторов нет. Их единственное отличие в том, что при инициализации значений через {} скобки не происходит преобразования типа.

В то же время, попытки вызова конструктора предка невозможно целом (если не инициализировать или динамически выделять память для объекта класса предка в списке инициализаторов). Поэтому вышеперечисленные код или является ошибкой или нечто иным, чем просто вызов конструктора.

→ Ссылка